WIP feat: pfe-button component

First pass at creating a button.

@kylebuch8 @castastrophe Is further design support and/or documentation needed here?

We are good from the design side, we will be repurposing the same styles from PF.

Is the button height 34px? That's what it looks like here https://deploy-preview-837--happy-galileo-ea79c4.netlify.app/elements/pfe-button/demo/
PF buttons and form inputs are both 36px

Is the button height 34px? That's what it looks like here https://deploy-preview-837--happy-galileo-ea79c4.netlify.app/elements/pfe-button/demo/
PF buttons and form inputs are both 36px

@kylebuch8 Looking at the PF button styles here: https://www.patternfly.org/v4/documentation/react/components/button, it looks like we'll need to import or extend a few form spacing variables in our system since we don't have a 6px spacing variable at the moment.  You'll also want to set the line-height for the button to 1.5.  I can help with this if you like.

Looking at the PF button styles here: https://www.patternfly.org/v4/documentation/react/components/button, it looks like we'll need to import or extend a few form spacing variables in our system since we don't have a 6px spacing variable at the moment.

@castastrophe not sure I follow. Do we just need to add another spacing var in _general.scss? I'm happy to tackle this, just need some guidance :)

@castastrophe not sure I follow. Do we just need to add another spacing var in _general.scss? I'm happy to tackle this, just need some guidance :)

Hey @eyevana!  So I'm just thinking "out loud" but we could just extend $pf-global--spacer--form-element from<EMAIL_ADDRESS>@starryeyez024 How have you approached this in your branch where you were pulling in assets directly from PatternFly as a dependency?

@castastrophe not sure I follow. Do we just need to add another spacing var in _general.scss? I'm happy to tackle this, just need some guidance :)

Hey @eyevana! So I'm just thinking "out loud" but we could just extend $pf-global--spacer--form-element from<EMAIL_ADDRESS>@starryeyez024 How have you approached this in your branch where you were pulling in assets directly from PatternFly as a dependency?

Kyle actually set this the packageImporter for me, and I was not able to get your suggested approach working @castastrophe  but I defer to you if you'd like to open a new  branch that updates the gulpfile so that we can import files from PF core.
But once we have it set up, its as easy as importing the path to PF core variables (either colors, or spacers, whatever you need):
https://github.com/patternfly/patternfly-elements/pull/895/files#diff-5ae7cc88f82fdb6a36e0b29daa0ff5fbR1


AcademySoftwareFoundation#612  change paths to relative

change path in openvdb from #include <openvdb/..> to #include ".."
add target_include_directories for executables

Hey, @danrbailey since you were involved in #612 I wanted to ask if this PR is correct or what should be changed.
I shortened the paths like you suggested, from #includes <openvdb/math/Math.h> to #include "Math.h".
I added target_include_directories to some cmake files, to be able to include without a ../.
Also, all includes could be done without the openvdb folder #includes  "openvdb/math/Math.h"  -> #includes  "math/Math.h", could this cause any problems? It was used like that in points.cc.

This looks pretty good to me. I've approved running our CI on this PR so we can see if there are any issues uncovered through doing this on different platforms.
The main thing I would suggest changing is to revert the changes to cases where we are using angle brackets (<>) for headers that are located outside of the file's directory as stated in our coding style. For example, openvdb_print.cc should continue to use angle brackets to include headers from the core openvdb library. In essence, removing all the CMake target_include_directories(XXX PRIVATE ../.) changes and fixing all the resulting errors should resolve this.

I reverted the changes and the build failed. The problem was, that includes form other cmake files/executables did not find shortend paths like #include "openvdb.h" instead they need a #include "openvdb/openvdb.h".
After I changed every file to that signature, everything build fine again.

I looked it all through and resolved all the issues you had, and also changed the #include <openvdb/version.h> to #include "openvdb/version.h".

Thanks @gaida-exe, this looks pretty close to being ready to merge. Should we move this out of being a draft PR now?

Sure, if you have no other suggestions.

Sorry, I'm late to the came and I'm going to voice my dissent here. First change I see is in openvdb/Exceptions.h which changed to refer to "openvdb/version.h". But since there's no openvdb/openvdb/version.h, this would just go back to -I compiler options anyways.
If the intention here was actually to change to relative paths, then it should become "version.h"

Sorry, I'm late to the game but I'm going to voice my dissent here anyways. First change I see is in openvdb/Exceptions.h which got <openvdb/version.h> modified to "openvdb/version.h" instead. But since there's no openvdb/openvdb/version.h, this would just go back to -I compiler options anyways. If the intention here was actually to change to relative paths, then it should become "version.h"

Is this the only issue you see or are you disagreeing with this PR more generally? This is easily fixable by tweaking the CMake include paths (which are needed as version.h is auto-generated)

Is this the only issue you see or are you disagreeing with this PR more generally? This is easily fixable by tweaking the CMake include paths (which are needed as version.h is auto-generated)

I think I disagree with this change generally until pending a review of that these changes are doing what we actually intend on. I'm not entirely sure what "tweaking CMake include paths" has to do with how openvdb is consumed on the library client side, which is what these include changes affect.

I've made the suggested change that @e4lam pointed out (in openvdb/Exceptions.h). But I'll set the PR back to draft, until the discussion  is resolved.

I think I disagree with this change generally until pending a review of that these changes are doing what we actually intend on. I'm not entirely sure what "tweaking CMake include paths" has to do with how openvdb is consumed on the library client side, which is what these include changes affect.

We've reviewed what these changes intend... right? We just missed this one. version.h is special because, at build time, it has to be pulled from the binary directory. Obviously once it's installed it should be included as "version.h" from any files that live next to it (Exceptions/Types/etc.). But the current CMake include paths (the paths configured when building vdb) pull it from a parent folder, not from the folder it lives in.

I've made the suggested change that @e4lam pointed out (in openvdb/Exceptions.h). But I'll set the PR back to draft, until the discussion is resolved.

You may find that simply changing this causes VDB not to build. You may need to add an additional include path to ${CMAKE_CURRENT_BINARY_DIR}/openvdb/openvdb

The goal, I think, is to handle a situation where openvdb headers exist on /usr/local/include, so are in either -Isystem or -I path.  However, in my code, I want to include one particular bespoke openvdb library.
For concreteness, say I do this by a direct absolute path include without using path search:
#include "/opt/mystuff/openvdb_special/openvdb/openvdb/tools/Merge.h"
This will then in turn hit:
#include "openvdb/tree/NodeManager.h"
Because the current directory of Merge.h is openvdb/tools, there is no openvdb/tools/openvdb/tree, so the relative path lookup fails.  #include then devolves into a system path search and I'll pick up the system library.  I now have a mixture of system and special libraries being used.
Alternatively, if it has
#include "../tree/NodeManager.h"
I will get the correct /opt version of all the dependencies.
I think this means, as a rule, that if one uses "" one wants the relative path to ALWAYS succeed.
The down side is you can't patch VDB by adding a Merge.h to your -I path that doesn't have the rest of the openvdb library present, as all the relative searching will fail and ../tree isn't on the global search path.
I recall there being some discussion that -Isystem and -I behave differently for "" and <> but I can't find reference to that, both seem to be searched for both.  The difference is that -I always pre-empts -Isystem in searches.

We've reviewed what these changes intend... right? We just missed this one. version.h is special because, at build time, it has to be pulled from the binary directory.

But that doesn't seem to be what happened in plenty of other cases that I see in the change. To pick another random example, we have openvdb/math/ConjGradient.h including "openvdb/Exceptions.h" which has the exact same issue. If the intention is to change to use relative paths, then I'd expect the change to be "../Exceptions.h". As it stands, there's lot of changes here have no new effect with the switch to double-quotes, in which case, we might as well have kept them as angle brackets. What am I missing?

@danrbailey pointed out that these changes with "../" should not be made, because of the style-guide mentioned here.
I could revert the changes, where the correct relative path would include a "../", since it apparently has no effect.

I've made the suggested change that @e4lam pointed out (in openvdb/Exceptions.h). But I'll set the PR back to draft, until the discussion is resolved.

You may find that simply changing this causes VDB not to build. You may need to add an additional include path to ${CMAKE_CURRENT_BINARY_DIR}/openvdb/openvdb

If you mean the change that I did in 92f2779 . It compiled in my build before I pushed it and also some files in master use this type of include like here.

If we can't have upwards relative include paths, then I don't see why we should make any of these changes at all since it defeats the purpose of changing to use include double-quotes in the first place. Perhaps, I don't understand the motivation for this PR?

If we can't have upwards relative include paths, then I don't see why we should make any of these changes at all since it defeats the purpose of changing to use include double-quotes in the first place. Perhaps, I don't understand the motivation for this PR?

Yeah sorry I think using the term "relative include paths" has become missleading with the objective of this PR. There are three main scenarios we're dealing with:

1 Building OpenVDB and its components all from source
2 Building some OpenVDB components from source against an existing OpenVDB installation
3 Building a downstream codebase against an existing installation of OpenVDB

These changes aim to address issues with 1 and 2 and should not really impact 3 (unless you have multiple installations of OpenVDB which are included both through -I and -isystem).
Lets say you have an existing installation of OpenVDB and TBB in /usr/local/include and /usr/local/lib and you end up with a compile command that looks like this:
c++ -I/path/to/source/openvdb -isystem /usr/local/include -o some_vdb_object.o -c some_vdb_source.cc
GCC (and afaik clang) treat quotes and bracketed includes differently when the path is given with -I or -isystem. Headers quoted "" will first be searched for in the same directory the current source resides. This is improved in a few cases, but as you point out doesn't apply to cases where a file in /tool includes something like `"openvdb/version.h". However, if a path is given with -I then this causes the path to be searched after the current directory and AHEAD of the standard system directories. But this is only true for the quoted form of #include. The bracketed version always searches system paths first i.e. /usr/local/include.
We're really missusing the term "relative" here as I think the main object of this PR is to simply force the compiler to read from -I directories before -isystem for openvdb includes when building openvdb. Downstream software can use -I or -isystem when including vdb headers and should notice any difference (the only percievable difference I'm aware of would be if you have two installations of OpenVDB which both end up on the include path - this PR will change indirect headers to be picked up from the -I one over -isystem).
Either way if there is concern this doesn't have to go in to 9.1. And it's late here now so I may be entirely wrong, I'll re-read this all tomorrow 👍

However, if a path is given with -I then this causes the path to be searched after the current directory and AHEAD of the standard system directories. But this is only true for the quoted form of #include. The bracketed version always searches system paths first i.e. /usr/local/include.

As far as I can tell in my test (attached here inctest.tar.gz), regardless of whether the include uses quotes or angle brackets, the -I options on gcc are always searched BEFORE -isystem paths:
On my cygwin gcc 11, doing source run.sh gives:
g++ (GCC) 11.2.0
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

=== gcc -isystem /tmp/test/inc2 -I /tmp/test/inc1 -c -o foo.o src/foo.cpp
In file included from src/foo.cpp:1:
/tmp/test/inc1/openvdb/subdir/file.h:1:17: note: ‘#pragma message: inside inc1/openvdb/subdir/file.h’
    1 | #pragma message "inside inc1/openvdb/subdir/file.h"
      |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /tmp/test/inc1/openvdb/subdir/file.h:2,
                 from src/foo.cpp:1:
/tmp/test/inc1/openvdb/version.h:1:17: note: ‘#pragma message: inside inc1/openvdb/version.h’
    1 | #pragma message "inside inc1/openvdb/version.h"
      |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
=== g++ -I /tmp/test/inc1 -isystem /tmp/test/inc2 -c -o foo.o src/foo.cpp
In file included from src/foo.cpp:1:
/tmp/test/inc1/openvdb/subdir/file.h:1:17: note: ‘#pragma message: inside inc1/openvdb/subdir/file.h’
    1 | #pragma message "inside inc1/openvdb/subdir/file.h"
      |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /tmp/test/inc1/openvdb/subdir/file.h:2,
                 from src/foo.cpp:1:
/tmp/test/inc1/openvdb/version.h:1:17: note: ‘#pragma message: inside inc1/openvdb/version.h’
    1 | #pragma message "inside inc1/openvdb/version.h"
      |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
=== gcc -isystem /tmp/test/angle2 -I /tmp/test/angle1 -c -o foo.o src/foo.cpp
In file included from src/foo.cpp:1:
/tmp/test/angle1/openvdb/subdir/file.h:1:17: note: ‘#pragma message: inside angle1/openvdb/subdir/file.h’
    1 | #pragma message "inside angle1/openvdb/subdir/file.h"
      |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /tmp/test/angle1/openvdb/subdir/file.h:2,
                 from src/foo.cpp:1:
/tmp/test/angle1/openvdb/version.h:1:17: note: ‘#pragma message: inside angle1/openvdb/version.h’
    1 | #pragma message "inside angle1/openvdb/version.h"
      |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
=== g++ -I /tmp/test/angle1 -isystem /tmp/test/angle2 -c -o foo.o src/foo.cpp
In file included from src/foo.cpp:1:
/tmp/test/angle1/openvdb/subdir/file.h:1:17: note: ‘#pragma message: inside angle1/openvdb/subdir/file.h’
    1 | #pragma message "inside angle1/openvdb/subdir/file.h"
      |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /tmp/test/angle1/openvdb/subdir/file.h:2,
                 from src/foo.cpp:1:
/tmp/test/angle1/openvdb/version.h:1:17: note: ‘#pragma message: inside angle1/openvdb/version.h’
    1 | #pragma message "inside angle1/openvdb/version.h"
      |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

And the docs https://gcc.gnu.org/onlinedocs/gcc/Directory-Options.html bear out what I see:

You can specify any number or combination of these options on the command line to search for header files in several directories. The lookup order is as follows:

For the quote form of the include directive, the directory of the current file is searched first.
For the quote form of the include directive, the directories specified by -iquote options are searched in left-to-right order, as they appear on the command line.
Directories specified with -I options are scanned in left-to-right order.
Directories specified with -isystem options are scanned in left-to-right order.
Standard system directories are scanned.
Directories specified with -idirafter options are scanned in left-to-right order.

So as far as I can tell, we can merrily go along right now without this PR and build with the OpenVDB lib/components from source as long as the we use -I for the include directory that we want instead of -isystem.

PS. I can't seem to edit my comment above but you'll need to rename the decompressed inctest.tar.gz to /tmp/test to use run.sh, or else you'll need to modify the paths accordingly.

@e4lam thanks very much for the tests. I thought this behaviour was explicit with default system dirs, not necessarily dirs given with -isystem i.e:
> gcc -E -Wp,-v -

#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/aarch64-linux-gnu/9/include
 /usr/local/include
 /usr/include/aarch64-linux-gnu
 /usr/include

But I'm also unable to produce the behaviour I was describing! I've been using these docs: https://gcc.gnu.org/onlinedocs/cpp/Search-Path.html

The most commonly-used option is -Idir, which causes dir to be searched after the current directory (for the quote form of the directive) and ahead of the standard system directories.

I think I misinterpreted the parenthesised clause, but was confident in that interpretation as I was sure that I'd experienced this behaviour before. I was perhaps muddling it with other platforms/compiler options (-I-, -iquote etc).
It does seem that MSVC at least treats quotes in a potentially more desriable way:
https://docs.microsoft.com/en-us/cpp/preprocessor/hash-include-directive-c-cpp?view=msvc-170

If the #include directive is specified using double-quote form, it first searches local directories. The search begins in the same directory as the file that contains the #include directive. If it fails to find the file, it searches next in the directories of the currently opened include files, in the reverse order in which they were opened. The search begins in the directory of the parent include file and continues upward through the directories of any grandparent include files.

In any case we should revisit this. I'm not convinced that just because relative includes are disallowed by the "style guide" that we shouldn't use them and so doing would make changing to the quoted form more relevant.
Also:

I'm not entirely sure what "tweaking CMake include paths" has to do with how openvdb is consumed on the library client side, which is what these include changes affect.

It seems that we've ultimately come to the conlusion that this change won't change anything for clients.

It seems that we've ultimately come to the conclusion that this change won't change anything for clients.

As Jeff noted above, the only potential advantage of using quote includes with relative paths is some client needs to directly include and use different OpenVDB versions within the same project. And I thought that was the motivation for this PR. If it's for building OpenVDB, then I don't see any advantage for this change.
FWIW, I'd like to point out that Boost remains in the camp of using angle bracket includes when referencing other boost libraries. First random result I found:

https://github.com/boostorg/thread/blob/1de55fceda1829fa3b29fcfd4efe8f94de0a01d1/include/boost/thread/thread_time.hpp#L9

Yes I just wanted to clarify that, as it stands, this change should have absolutely no impact which was what was originally implied.

FWIW, I'd like to point out that Boost remains in the camp of using angle bracket includes when referencing other boost libraries. First random result I found:

Clang/LLVM uses quotes. But I don't think we should arbitrarily pick repos to use as a reference as none of this is standardized. It's whatever makese the most sense for the project.

#1418


Import-Html not working

$  import-html https://www.science.co.il/elements/ 0
InvalidOperation: C:\Users\admin\Documents\PowerShell\Modules\ImportExcel\7.1.2\Public\Get-HtmlTable.ps1:15
Line |
15 |      $table = $r.ParsedHtml.getElementsByTagName("table")[$TableIndex]
|      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| You cannot call a method on a null-valued expression.
InvalidOperation: C:\Users\admin\Documents\PowerShell\Modules\ImportExcel\7.1.2\Public\Get-HtmlTable.ps1:21
Line |
21 |          $row = $table.rows[$idx]
|          ~~~~~~~~~~~~~~~~~~~~~~~~
| Cannot index into a null array.

I noticed this not working with PowerShell version 7.1.3 but works as designed with Windows PowerShell (5.1).
Will dig deeper.....

@stahler yes, I'm using pwsh 7.1.3, the current version of Invoke-WebRequest returns the Basic

I recall reading about some of the issues with Invoke-WebRequest on PWSH.  Here is a chain that while interesting, doesn't necessarily provide a solution: https://github.com/PowerShell/PowerShell/issues/2867

Thanks Wes! Yeah, if failed for me on 7.1.3. Also tried just the iwr and getElementId, it didn't but got no data in the ParsedHtml. I used and tweaked Lee Holmes code from his blog to put that together. Haven't had a chance to look to see if he may have an updated version somewhere, or how 7.1.3 works.

https://github.com/PowerShell/PowerShell/issues/15500

Thanks @scriptingstudio, I suspected, good to get confirmation.


chore: add wait time for packet relay to e2e test for ICA channel opening after packet timeout

Description

closes: #2850
I didn't add a changelog entry as as it didn't seem necessary.
Commit Message / Changelog Entry
see the guidelines for commit messages. (view raw markdown for examples)

Before we can merge this PR, please make sure that all the following items have been
checked off. If any of the checklist items are not applicable, please leave them but
write a little note why.

[ ] Targeted PR against correct branch (see CONTRIBUTING.md).
[ ] Linked to Github issue with discussion and accepted design OR link to spec that describes this work.
[ ] Code follows the module structure standards.
[ ] Wrote unit and integration tests.
[ ] Updated relevant documentation (docs/) or specification (x/<module>/spec/).
[ ] Added relevant godoc comments.
[ ] Provide a commit message to be used for the changelog entry in the PR description for review.
[ ] Re-reviewed Files changed in the Github PR explorer.
[ ] Review Codecov Report in the comment section below once CI passes.

Codecov Report

Merging #2858 (012a3ac) into main (2bfdbaf) will decrease coverage by 0.02%.
The diff coverage is 100.00%.

Additional details and impacted files

@@            Coverage Diff             @@
##             main    #2858      +/-   ##
==========================================
- Coverage   78.34%   78.32%   -0.03%
==========================================
  Files         181      181
  Lines       12560    12560
==========================================
- Hits         9840     9837       -3
- Misses       2283     2285       +2
- Partials      437      438       +1

Impacted Files
Coverage Δ

modules/core/02-client/types/keys.go
85.71% <ø> (-14.29%)
:arrow_down:

modules/light-clients/06-solomachine/module.go
50.00% <100.00%> (ø)

modules/light-clients/07-tendermint/module.go
50.00% <100.00%> (ø)

What do you think?

I agree haha

I think ideally there would be a way we could call the relayer to clear all packets currently waiting to be relayed. I believe by the time BroadcastMessages returns, the packet send event should have already been relayed

This is a good stop gap solution, but it'd be nice to add a function which could be certain to continue exactly when the packet has been relayed

I'll open an issue for this 👍

thanks for fixing the test @charleenfei  🥇 !


PyTorch not available error on SageMaker GPU docker though it is installed

I get en error when running data loading using SageMaker SDK
  File "main.py", line 34, in <module>
    run_training()
  File "main.py", line 25, in run_training
    dm.setup('fit')
  File "/opt/conda/lib/python3.6/site-packages/pytorch_lightning/core/datamodule.py", line 92, in wrapped_fn
    return fn(*args, **kwargs)
  File "/opt/ml/code/data_module.py", line 103, in setup
    self.dataset[split].set_format(type="torch", columns=self.columns)
  File "/opt/conda/lib/python3.6/site-packages/datasets/fingerprint.py", line 337, in wrapper
    out = func(self, *args, **kwargs)
  File "/opt/conda/lib/python3.6/site-packages/datasets/arrow_dataset.py", line 995, in set_format
    _ = get_formatter(type, **format_kwargs)
File "/opt/conda/lib/python3.6/site-packages/datasets/formatting/__init__.py", line 114, in get_formatter
    raise _FORMAT_TYPES_ALIASES_UNAVAILABLE[format_type]
ValueError: PyTorch needs to be installed to be able to return PyTorch tensors.

when trying to execute dataset loading using this notebook  https://github.com/PyTorchLightning/pytorch-lightning/blob/master/notebooks/04-transformers-text-classification.ipynb, specifically lines
self.columns = [c for c in self.dataset[split].column_names if c in self.loader_columns]
self.dataset[split].set_format(type="torch", columns=self.columns)

The SageMaker docker image used is<PHONE_NUMBER>84.dkr.ecr.eu-central-1.amazonaws.com/pytorch-training:1.4.0-gpu-py3 .
By running container interactively I have checked that torch loading completes successfully by executing https://github.com/huggingface/datasets/blob/master/src/datasets/config.py#L39.
Also as a first line in the data loading module I have
import os
os.environ["USE_TF"] = "0"
os.environ["USE_TORCH"] = "1"

But unfortunately the error stills persists. Any suggestions would be appreciated as I am stack.
Many Thanks!

cc @philschmid

Hey @sivakhno,
how does your requirements.txt look like to install the datasets library and which version of it are you running? Can you try to install datasets>=1.4.0

Hi @philschmid - thanks for suggestion. I am using datasets==1.4.1.
I have also tried using torch=1.6.0 (docker<PHONE_NUMBER>84.dkr.ecr.eu-central-1.amazonaws.com/pytorch-training:1.6.0-gpu-py3 ), but the error is the same.

Could paste the code you use the start your training job and the fine-tuning script you run?

@sivakhno this should be now fixed in datasets>=1.5.0.

@philschmid Recently released tensorflow-macos seems to be missing.

I've created a PR to add this.


When I am sliding down the drawer when its in collapsed state, the onExpanded function is still calling

So I wanted to change the content of the drawer when it gets expanded. So I have 2 components, one will render when the drawer is in the collapsed state and one when the drawer is expanded. But when i am even touching the drawer, the onExpanded gets called and the expanded component gets render even if the drawer is not opened.
The component renders even if the drawer is pulled downwards when it is in a collapsed state

I am running into a similar issue. The "onExpanded" callback is running at the start of the action rather than at the completion of the animation. I have a state toggle tied with onExpanded and onCollapsed, and the onExpanded will run by slightly dragging the drawer up and releasing before it is far enough to switch state.

I managed to get a quasi-fix to my problem. In the Animator.js I changed:
  _handlePanResponderRelease = (e, gesture) => {     if (gesture.dy > this.props.toggleThreshold && this.props.currentPosition === this.props.upPosition) {       this._transitionTo(this.props.downPosition, this.props.onCollapsed);     } else if (gesture.dy < -this.props.toggleThreshold && this.props.currentPosition === this.props.downPosition) {       this._transitionTo(this.props.upPosition, this.props.onExpanded);     } else {       this._resetPosition();     }   }
to this:
  _handlePanResponderRelease = (e, gesture) => {     if (gesture.dy > this.props.toggleThreshold && this.props.currentPosition === this.props.upPosition) {       this._transitionTo(this.props.downPosition, this.props.onCollapsed);       console.log('collapsed')     } else if (gesture.dy < this.props.toggleThreshold && this.props.currentPosition === this.props.downPosition) {       this._transitionTo(this.props.upPosition, this.props.onExpanded);       console.log('expanded')     } else {       this._resetPosition();       console.log('reset')     }   }

I have added a simple callback onCompletedToggle() that triggers when the drawer animation successfully completes opening or closing. I can submit a PR.

https://github.com/jacklein/rn-bottom-drawer/pull/31

@phbprogramming  You were on the right lines, but in the wrong function. Under _transitionTo, remove the callback from the Animated.spring(...)start() function:
Animated.spring(this.position, {       toValue: position     }).start();


lua: align the allocated memory

Description:
This patch aligns the memory that is allocated by Lua. Previously, without alignment, Envoy experienced segfault when constructing StreamWrapperHandler using the placement new operator on the pre-allocated (via new_luauserdata API) memory by Lua.
Risk Level: Medium for Lua users.
Testing: Enable test in UBSAN on Linux as well.
Docs Changes: N/A
Release Notes: N/A
Fixes #5551

@lizan do you think this will make those remaining ASAN issues I was encountering a while back go away?

@htuch I missed you comment, what are the remaining ASAN issues?

https://github.com/envoyproxy/envoy/pull/6196 and

@htuch possibly, let me try on that

Thanks @lizan 🙇


Drag drop style customization

Hi,
I like how the drag drop is organised in gridster.
I would like to know if the style for drag and drop can be customized. The style I am trying to achieve is

the current new widget position style is a faded area. instead can I customize it to have something with dotted border
When the widget is dropped, the widget flows into the new place, instead can it be customized to snap into the new place. E.g. http://datatorrent.github.io/malhar-angular-dashboard/#/

Thanks

Yes, you can do this very well even:

The element being dragged gets the class dragging, so feel free to play around with that. The semi-transparent 'preview' of the widget's new position is class preview-holder, which can be customised as well.

This is done by CSS3's transitions, which are in the stylesheet. Have a look at all rules with left .3s, top .3s, like this one:

.ready .gs-w:not(.preview-holder) {
    -webkit-transition: opacity .3s, left .3s, top .3s;
    -moz-transition: opacity .3s, left .3s, top .3s;
    -o-transition: opacity .3s, left .3s, top .3s;
    transition: opacity .3s, left .3s, top .3s;
}

When you remove left .3s, top .3s (without breaking the code), it'll snap in nicely.

You can also overwrite the styling fairly simple: http://jsfiddle.net/b0ndt/v7duxydd/ (this is cleaner than changing core files).

Thank you for the response. The suggested style change works beautifully.


Failed to load pretrained model

I just tried to launch a test as the Readme said using pretrained model  which offered by @Gofinge in https://github.com/Pointcept/Pointcept/issues/42.
An error occured:
[2023-07-13 16:16:37,336 INFO test.py line 37 17360] => Building model ...
[2023-07-13 16:16:38,541 INFO test.py line 40 17360] Num params: 3908641
MODEL_PATH:/mnt/c/workspace/Pointcept/pretrained_model/semseg-s3dis-ptv2m2.pth
Traceback (most recent call last):
  File "tools/test.py", line 95, in <module>
    main()
  File "tools/test.py", line 84, in main
    launch(
  File "/mnt/c/workspace/Pointcept/pointcept/engines/launch.py", line 87, in launch
    main_func(*cfg)
  File "tools/test.py", line 57, in main_worker
    model.load_state_dict(new_state_dict, strict=True)
  File "/home/owl/anaconda3/envs/pointcept/lib/python3.8/site-packages/torch/nn/modules/module.py", line 1604, in load_state_dict
    raise RuntimeError('Error(s) in loading state_dict for {}:\n\t{}'.format(
RuntimeError: Error(s) in loading state_dict for DefaultSegmentor:
        Missing key(s) in state_dict: "backbone.patch_embed.proj.0.weight", "backbone.patch_embed.proj.1.norm.weight",
   ...

Any ideas while be much appreciate.

It might be because the weight is from an old version of the codebase. I suggest training S3DIS again or using another shared weight trained on SemanticKITTI (I trained it recently)

It might be because the weight is from an old version of the codebase. I suggest training S3DIS again or using another shared weight trained on SemanticKITTI (I trained it recently)

OK，Thanks， I’ll try it


Design and Implement Config API

A Config API is required for EG to consume config params through gatewayclass.spec.parameterRefs. This config API is referred to as "Bootstrap Config" in https://github.com/envoyproxy/gateway/pull/16.

@arkodg I assigned this issue to you based on the 5/24/22 community meeting notes. Please unassign yourself if that's not the case.

https://github.com/envoyproxy/gateway/pull/146 resolves this issue.


nhanes_variables.tsv no longer has quoted fields

In the latest release, nhanes_variables.tsv no longer has "" around the values as it has in previous commits.

Indeed it seems the quotes get removed during post-processing of the downloaded metadata. Should have a fixed-up release by the end of today.


npx create-react-app -> ERROR parsing near jest

Describe the bug
First I installed Node.js from their official website. The installation was perfectly fine. Then I went into VScode and ran npm install -g create-react-app <--- THIS WORKS 98 packages installed. NOW THE REAL ISSUE:
After all that I try npx create-react-app mp
and then I get this error.

I have no idea how to fix it. I've tried uninstalling & delete files from Roaming data, however no help. I am simply trying to learn react however their installation is giving  me trouble for couple days. Someone please help.
Did you try recovering your dependencies?
Yes like I said, but does not work upon reinstall of Node.js
I have also tried after clearing npm cache but no luck.

I guess it only happens on my Microsoft Surface Pro, I tried installing it again on my home desktop following the steps listed on the react website, and it works perfectly, so I'm gonna close this issue.


fix(vite-plugin): Omit React-Router v7 plugin for DevServer

Similar to https://github.com/vanilla-extract-css/vanilla-extract/pull/1308.
Omit React-Router plugin for DevServer in Vanilla-Extract Vite plugin, as React-Router plugin throws when launched without Configuration file. (just like the Remix plugin)

@askoufis this is a simple one and will enable compatibility with React Router 7.

@kube Could you run the format script? Will merge after that's done.

@askoufis Done.


Properly invalidate client after CRD install

As the CRDs are installed before the capabilities are gathered, the current call to invalidate the discovery client is premature and expensive.
What actually is required is an invalidation of the REST mapper, as otherwise the Helm install action may later on fail with a resource mapping not found error. More specifically when the caller of the action is making use of a persisting1 RESTClientGetter.
Which is not something done by the Helm CLI (albeit it could, and this would potentially save quite some resources?), but is a default configuration offered by the Helm SDK via kube.New when a nil value is provided as the getter.

@sabre1041 would you be open to a follow up which further tries to see if we can remove the expensive ServerGroups call in full? As in a fork of the CRD logic we are using in helm-controller, this does not seem to be required at all (we do not even invalidate, but that's allowed mainly because getCapabilities later does this).
In addition, I could fill d7d624d as a separate PR to reduce resource usage of the CLI (re-using the instantiated clients really is cheaper, and saves quite a bit of RAM).

@hiddeco lets track any further enhancements in a separate PR. Given that the PR contained here does address the challenge of invalidating the client after CRD install, lets work on getting this merged and follow up with subsequent enhancements


Profile doesn't work for the Tailscale iOS Client?

First of all, thank you for this great project. Everything is working as good as it could and most of the issues seem to be stemming from our attempt to override the control plane for Tailscale clients, and not from behavioral differences of the control plane itself.
So far no matter what I have done, I wasn't able to get the iOS Tailscale client to respect the profile from /apple/ios and communicate with my control server. And tailscale-ios isn't open-sourced unlike tailscale-android preventing us from being unable to write a quick patch? Is this known or expected?

Yes iOS does not work, the code for the profile should be commented out and not presented in the web endpoint.

Gonna close this since it is out of our hands. Feel free to update the docs that confused and mentioned iOS.

What does an example .mobileconfig file looks like? Also I could not seem to way to install .mobileconfig files with the Apple Configurator 2. Can anyone nudge me in a direction on how it works with version 2?


ng-route + web-components crashes Chrome

Chrome tab crashes during ng-repeat compilation when:

it's content includes a custom element, which has @import inside it's shadow's inline styles
it's inside a ng-route template

Example:
<!DOCTYPE html>

  <ng-view></ng-view>

  <template id='my-component-template'>

  </template>

gist | output
Angular 1.3.15
Chrome 42.0.2311.90 (64-bit)
Ubuntu Linux 14.10 64-bit
I'm almost sure it's a Chrome (42.0.2311.90) bug, but since it manifests itself when using angular, I've decided to report it here too.

@mskrajnowski - the link to the Chrome issue fails with a 403 forbidden error for me. Any idea why?
@caitp - any thoughts one what is causing this?

The actual explosion occurs on this line:
https://github.com/angular/angular.js/blob/master/src/ng/compile.js#L2501
parent.replaceChild(newNode, firstElementToRemove);

where newNode is the ng-repeat comment and firstElementToRemove is the WebComponent

Re: the 403, It's most likely been deemed sec-critical and marked private<EMAIL_ADDRESS>only) to prevent it from being abused by authors who stumble upon it. But that's just a guess.
As for what's causing it, probably a bug.  The good news is I can't reproduce this in M45

OK, so this is not a bug, per se, with Angular as I can reproduce it without Angular loaded.
See https://gist.github.com/petebacondarwin/442f842b6a49d76dbcf5
<!DOCTYPE html>

  <template id='my-component-template'>

  </template>

<my-component></my-component>


Respect no google indexing preference if set in yoast

Due to lack of draft preview mode, we tried to see if we could publish a page in Wordpress  and tell yoast to block Google from indexing it, but that option doesn't propagate up to the page meta tags. We should ensure that noindex/nofollow preference is set per-page so that editors can work on preview pages on a dev URL with a reasonable cloak of privac

Closed by 48e6f1df49e9a0e153fc0ea4027b2478dbfd649f


Appstudio update mvp-test-component

Pipelines as Code configuration proposal

Pipelines as Code CI/mvp-test-component-on-pull-request has successfully validated your commit.

StatusDurationName

✅ Succeeded
7 seconds
init

✅ Succeeded
19 seconds
clone-repository

✅ Succeeded
1 minute
build-container

✅ Succeeded
14 seconds
deprecated-base-image-check

✅ Succeeded
12 seconds
inspect-image

✅ Succeeded
1 minute
clamav-scan

✅ Succeeded
20 seconds
clair-scan

✅ Succeeded
11 seconds
sbom-json-check

✅ Succeeded
16 seconds
label-check

✅ Succeeded
16 seconds
optional-label-check

✅ Succeeded
12 seconds
show-summary


fix: duplicated android folder on create flutter_plugin

Description
When creating a new flutter plugin, the _android folder gets duplicated in two different places, one is on the root folder (which is the correct place) and another one is on the app-facing package.
Steps To Reproduce

Run  very_good create -t flutter_plugin bla
Check the root folder, there will be a bla_android
Enter the bla folder, there will another bla_android here

Expected Behavior
The app-facing package shouldn't contain an android folder

This should be resolved in v0.4.17 🎉


cancel_at_period_end should be true for complimentary subscriptions

Issue Summary
In my theme, it seems like cancel_at_period_end returns false when the member is comped, so my 'renews' text shows instead of 'expires' even though it's shows as 'expires' in the Ghost built-in views.
Steps to Reproduce
{{#foreach @member.subscriptions}}
	{{#if cancel_at_period_end}}
		expires
	{{else}}
		renews
	{{/if}}
{{/foreach}}

Ghost Version
5.25.0
Node.js Version
?
How did you install Ghost?
Cloudron
Database type
MySQL 8
Browser & OS version
Firefox latest, macOS catalina
Relevant log / error output
No response
Code of Conduct

[X] I agree to be friendly and polite to people in this repository

This needs a bit of a deeper review to see what fields we're using to calculate this on the internal screens and whether they are or should be exposed to themes.
Will take a look, but it won't be until after the new year.


It is not a bug but I really want to have an answer

can we just read a file from ios files application without opening it into the unity application

I'm a bit confused; can you elaborate? Is your Unity app automatically opened when you click on a specific file in Files app? Do you want to just pass a "string filename" to an API and want it to fetch the file with that filename automatically, without opening the native dialog? Or something else entirely?

Thank you for replying, 5 starts to you. Yeah, lets say I have a video in file application I know its name, is there anyway I can load the file into unity application or just read it into my unity application without natively opening the file application

This isn't possible with this plugin. On latest Android versions, I'd say that it's impossible without the MANAGE_EXTERNAL_STORAGE permission which is "very restricted" if you're planning to publish on Google Play. I have no clue about iOS.


No plugin icon and setting menu

Logseq version: 0.8.16
Plugin version: 5.2.0

Should be fixed in 5.2.1. Please try.

Should be fixed in 5.2.1. Please try.

The setting menu is back but still no icon in the plugin dropdown tho.

Oh, I didn't know that, just started using this plugin and the documentation said there is

Oh, I didn't know that, just started using this plugin and the documentation said there is

Yeah apologies. The READMEs for all my plugins are significantly outdated. 😢

just forked the project, may I ask why the methods are imported from non exist folder? I changed to services/todoistHelpers but removePrefix is still missing. How can you build that without error? I'm brand new to plugin dev, so it would be great help if you can explain it. Also, are there any resources you recommend for logseq development?

The unpacked version pull from the master branch still faced the same problem.

nvm, it was my bad

Great! Hmm, I am not a software engineer by training so I am not sure if I am the best person to ask 😂
But I use Javscript and Typescript and the plugin API methods can be found at https://plugins-doc.logseq.com. It is perhaps best to start with a particular idea you have in mind and learn how to build it by looking at other similar plugins.
Feel free to ask any questions in Discord! I go by the same handle.


[Doc] linting Branch 2.2

Fixes #issue
What type of PR is this:

[ ] BugFix
[ ] Feature
[ ] Enhancement
[ ] Refactor
[ ] UT
[x] Doc
[ ] Tool

Does this PR entail a change in behavior?

[x] Yes, this PR will result in a change in behavior.
[ ] No, this PR will not result in a change in behavior.

If yes, please specify the type of change:

[ ] Interface/UI changes: syntax, type conversion, expression evaluation, display information
[ ] Parameter changes: default values, similar parameters but with different default values
[ ] Policy changes: use new policy to replace old one, functionality automatically enabled
[ ] Feature removed
[ ] Miscellaneous: upgrade & downgrade compatibility, etc.

Checklist:

[ ] I have added test cases for my bug fix or my new feature
[ ] This pr needs user documentation (for new or modified features or behaviors)

[ ] I have added documentation for my new feature or new function

Bugfix cherry-pick branch check:

[ ] I have checked the version labels which the pr will be auto-backported to the target branch

[ ] 3.2
[ ] 3.1
[ ] 3.0
[ ] 2.5

 Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you all sign our Contributor License Agreement before we can accept your contribution.14 out of 15 committers have signed the CLA.:white_check_mark: trueeyu:white_check_mark: meegoo:white_check_mark: stdpain:white_check_mark: rickif:white_check_mark: Smith-Cruise:white_check_mark: packy92:white_check_mark: wangruin:white_check_mark: wyb:white_check_mark: dirtysalt:white_check_mark: andyziye:white_check_mark: gengjun-git:white_check_mark: LiShuMing:white_check_mark: DanRoscigno:white_check_mark: satanson:x: mergify[bot]You have signed the CLA already but the status is still pending? Let us recheck it.


zfs: 2.0.5 -> 2.1.0

Motivation for this change
Updating zfs to the newest release.
Major New Features
Distributed Spare RAID (dRAID) - Create pools using a new distributed variant of RAIDZ which enables dramatically faster resilver times using integrated hot spares. Full redundancy can be restored to the pool in a fraction of the time normally required to do a full disk replacement.
Compatibility Property - The new compatibility property lets administrators specify the set of features which should be enabled on the pool. This fine grained control makes it easy to create portable pools and maintain pool compatibility between OpenZFS versions and across platforms.
InfluxDB Support - Collect pool statistics with the zpool influxdb command in an InfluxDB time-series database for analysis and monitoring.
Things done

[ ] Tested using sandboxing (nix.useSandbox on NixOS, or option sandbox in nix.conf on non-NixOS linux)
Built on platform(s)

[x] NixOS
[ ] macOS
[ ] other Linux distributions

[ ] Tested via one or more NixOS test(s) if existing and applicable for the change (look inside nixos/tests)
[ ] Tested compilation of all pkgs that depend on this change using nix-shell -p nixpkgs-review --run "nixpkgs-review wip"
[ ] Tested execution of all binary files (usually in ./result/bin/)
21.11 Release Notes (or backporting 21.05 Relase notes)

[ ] (Package updates) Added a release notes entry if the change is major or breaking
[ ] (Module updates) Added a release notes entry if the change is significant
[ ] (Module addition) Added a release notes entry if adding a new NixOS module

[ ] Fits CONTRIBUTING.md.

duplicate of https://github.com/NixOS/nixpkgs/pull/129026


Upgrade Lunaria and Action to latest

Description
This PR upgrades the @lunariajs/core package and the Lunaria Action to v0.1.0

size-limit report 📦

Path
Size

/index.html
5.79 KB (0%)

/_astro/*.js
21.95 KB (0%)

/_astro/*.css
13.62 KB (0%)


[Errno 104] Connection reset by peer

Thank you for sharing your great work!
I've been trying to run the project on my cellphone(android 14) after installing the App on it according to the readme.
However, I have encountered a problem that has troubled me for a long time. Every time it goes the 'X' circumstance, after receiving the XML sent by the phone, when the host got the next action and trying to send it to the phone, the socket will be disconnected and the error 'Connection reset by peer' will be reported. Have you encountered similar problems, and do you have any suggestions or solutions to the problem I am currently facing? Thank you again for your good work!

I would have to look into the detailed logs to find out what causes the problem. Can you tell us some details about this occurrence? log from MobileGPT app could help.
Also, does this error only occur for 'X'?

I would have to look into the detailed logs to find out what causes the problem. Can you tell us some details about this occurrence? log from MobileGPT app could help.
Also, does this error only occur for 'X'?

Thank you very much for your response! I have encountered two issues.
Firstly, the problem was a failure to successfully retrieve the app list, as evidenced by the app list being shown as 0 in the first log. I proceeded to bypass this issue by attempting to write fixed app package names.

Secondly, I encountered the disconnect issue as mentioned in the thread, which exclusively occors in 'X' (while everything runs OK under 'L', 'I', and 'S'). The disconnection occur right at the end of the 'X' when sending the action (at line 127 here).

Below, I have provided the app log for this issue. I really appreciate your time and look forward to your assistance and further response. Many thanks!

full logs are here below
problem1.log.txt
problem2.log.txt

As for the app list in apps.csv,
the app list gets initialized when you first install the MobileGPT app and authorize accessibility service to the app.
So that means that you need to have your MobileGPT server running when authorizing the MobileGPT app its accessibility permission.
As for the problem where you get socket disconnection right after sending the first XML file, check your mobile device's settings on the background app's resource usage. Some devices, especially Samsung Galaxy, have a strict policy for apps running in the background. And that could have caused the MobileGPT app to lose network access when it goes into the background.


How to set a playback error with media 3

I want to display a specific error message for my android auto app. Before media3, the error was managed like this (see) :
mediaSession.setPlaybackState(
    PlaybackStateCompat.Builder()
        .setState(PlaybackStateCompat.STATE_ERROR)
        .setErrorMessage(PlaybackStateCompat.ERROR_CODE_NOT_AVAILABLE_IN_REGION, getString(R.string.error_unsupported_region))
        // ...and any other setters.
        .build())

How should we do this with media3 ?

Duplicate of #543


GeoJSON Polygon not completely filled when not all of its points are visible

I have this Polygon. It is displayed fine.
However when I pan down or zoom in too much parts of it are not filled.

The polygon is created from a GeoJson source. Which is this:
    {
        "type": "Feature",
        "geometry": {
            "type": "LineString",
            "coordinates": [
                [
                    6.843612910433537,
                    51.20941905680739
                ],
                [
                    6.830562412355305,
                    51.23766270716715
                ],
                [
                    6.843592,
                    51.2496964
                ],
                [
                    6.8460656,
                    51.2500734
                ],
                [
                    6.8624629,
                    51.2403688
                ],
                [
                    6.863794667943361,
                    51.23810950525879
                ],
                [
                    6.8628855,
                    51.2173121
                ],
                [
                    6.8619949,
                    51.2116952
                ],
                [
                    6.843612910433537,
                    51.20941905680739
                ]
            ]
        },
        "properties": {
            "type": "hotspot"
        }
    }

Now I create the layer like this:
val layerOptions = GeoJsonLayerOptions
        .fill(true)
        .fillColor("#bb0055")
        .fillOpacity(0.1)
        .color("#bb0055")
        .weight(1)
        .clickable(false)
        .build

      L.geoJson(json, layerOptions)

Is this an SVG or a Leaflet or an issue from my side? What can I do?

Please see #3763.

Alright, I think this is because this is a LineString and not a Polygon. Therefore leaflet is not sure that it is a LinearRing, which it is and becomes crazy trying to fill it.

Alright it works if it's a MultiPolygon. Sorry for the trouble, although somebody might want to document that somewhere.


How to reference devtools console and log to it with custom HTML

Not sure where I should be asking these questions.
How do I access the devtools console panel in order to inject HTML or register a custom renderer I can trigger in a bank log line and then use to inject my custom HTML?
If firebug is styling logs in devtools console already and I can use that rendering system optionally or mandatory I can do that as well.
$feature https://github.com/firephp/firephp-for-firebug.next/issues/1

Found some docs: https://developer.mozilla.org/en-US/docs/Tools/Web_Console/Custom_output

Examples being developed: https://github.com/firebug/devtools-extension-examples/issues/3


Feature/ceiroa/tdtm advancement

The purpose of this PR is to implement the dependency injection mechnism between NPSP and Gift Entry. The idea is that the NPSP will get the TDTM Trigger dynamically based on if Gift Entry is installed or not.
Implemented the dependency injection mechnism for Gift Entry. So, Gift Entry can return a list of TiggerHanders for NPSP TDTM framework only when Gift Entry is installed.  Also, disabled some unit test cases when Gift Entry is installed.
*** Note to how to test the PR. There shouldn't be any logic changes in NPSP existing functionality. QA only needs to do the regression test for this PR and make sure the existing test cases pass.
Critical Changes
Changes

Implemented internal TDTM enhancements to support future development.

Issues Closed
Fixes #2995
New Metadata
Apex class:
ADV_Adapter
ADV_Info
ADV_Adapter_TEST
Custom Label:
adapterException
advConfigException
Deleted Metadata

Thanks @davidhabib @njjc @ceiroa @pedrodalcol for your time! And thanks @davidhabib @njjc for the great feedback about this PR! I will clean up this PR and submit for review soon.

@lianeyee For the Advancement project, we need an error message for one of the exception.
The use case is that we have some global api for Advancement in NPSP. And we do not want other customer to call it by accident.
I am thinking to throw an error like 'This function is for Advancement project, please do not call this function!' Is this message ok?
Please note that the message is for Apex Exception, it will not be in the UI.

@weizsforg Could we say this? "Invalid call. This function is reserved for Salesforce use."

@lianeyee Looks great! Thanks

@juliesnow Testing whether you can see this?

Yep...I see Review required, All checks have passed, and Merging is blocked. Is that what you expect me to be able to see?

And, of course, the whole thread between you and Wei

Great! Not sure why when I mention your username @juliesnow , I don't get the prompt that I usually get for other users. But glad that you're officially in the loop!

Hi @lianeyee I just updated the notes in this PR. Can you please review it? Basically, this PR is about providing support to Adv from NPSP. How detail we need to go about the implementation?

Hi @ceiroa , this PR is ready for review.
I added the @params in all the methods. Switched to use Label for the exception. Added the test class for Advancement_Adapter.
Thanks

@mpusto This is good to go on our side. I believe you wanted to be @mentioned so you could create a WI to have the item properly reviewed by someone on the NPSP team. For now I have assigned the item to @davidhabib.
Let us know if you have any questions. Thanks!

@weizsforg When or in what context would the incorrect config error be thrown? Should the message be written more for the end user or for the admin? (Picking this up for Julie, who's OOO for a bit today.)

@lianeyee There are two use cases for the error message.  1. Gift Processing is installed, but the customer does't have the license to use it. 2 Gift Processing is installed and licensed, but the config in custom metadata in Gift Processing is not set up correctly. For example, the typo in the API class API_HEDA -> API_HEDAA.
I think the error is more for the first person that use the system. Since if any of the issue happen, system will not work in the first place. But it will also happen when someone accidentally change the Gift Processing settings.

Thanks for the extra context, @weizsforg. Is sounds like the text proposed above will work then. Let us know if you need us to tweak it any further.

Thanks @lianeyee ! I will make the change based your comments.

@lianeyee @juliesnow . We need to add another label for exception.
In NPSP, we created an API for Gift Processing to set up some Account fields based on the Account Model (Household or One-One). If the Account model is Bucket account, we need to throw an exception from the API method.
Can we have a custom label like:
giftProcessingAccountException
Gift Processing Account Model error
Gift Processing currently does not support Bucket Account Model!

Hi @davidhabib , thanks for the feedback! Can you please review the changes? I will also update the new label after I get feedback from the Doc team.

Hi @lianeyee , any idea about the new label that I mentioned before?

Sorry @weizsforg! Thanks for poking me. I forgot about this one.
giftProcessingAccountException
Gift Processing account model error
Gift Processing doesn't support the Individual ("Bucket") account model.

@ceiroa and @weizsforg Now that this is merged into Master and will be sync'd up to all of our feature branches, the NGO team will need guidance on when to implement the if(ADV_PackageInfo_SVC.useAdv()) return; code in the new unit test classes that we're building. For example, there are 20 new Unit Test Classes in Customizable Rollups. I'm sure the Soft Credit Automation adds a handful as well.

Thanks @davidhabib @force2b @ceiroa for the help!
We had a discussion about how to handle the new test cases.  We are planning to add a "Feature Test - Gift Processing " as a new check in the PR. So, it will tell NPSP team know which test class failed under gift processing environment. And maybe NPSP team can @ us to have a look and figure out which ones are need to be disabled. For now, we can check in Gift Processing environment and create a new PR in NPSP to disable additional test cases.


Backups button does not appear when OpenTerrainGenerator is loaded

When loaded alongside OpenTerrainGenerator, Backups is unable to insert the Backups button into the world select screen. This is because OTG removes the Edit World and Recreate World buttons from the world select GUI. Backup functionality still seems perfectly functional, however the most convenient means of accessing backups is rendered inaccessible by this change, severely impacting this mod's usability - as far as I can tell, features like the ability to enter backups are effectively removed by the conflict.

I fixed this a while back but it seems an update to OTG broke it again. It should be fixed now in version 1.4.9.


Draw lines by geocoordinates.

Hi!
I'd like to draw .gpx routes on mapview, is there generic class for drawing lines (simple line between two geocoordinates) or how would I go about it?
Actually worked out temporary solution with canvas lines drawn from MapMarkers, however I think marker positioning is off when map is zoomed.
Checked with examples from this repo and it seems marks are actually off when map is zoomed (kivy 1.9.2 dev)

I implemented this here. https://github.com/kivy-garden/garden.mapview/compare/master...frmdstryr:master . Works with zooming, moving, etc...

@frmdstryr I've came up with similar implementation, but what I'd really like is mode="scatter" on my layer where I draw lines, because recalculating too many points on every MapView transform takes too long.
And while for simple translation "scatter" works ok, it doesn't work for zooming. Unless I'm doing something wrong... here's example code I'm using: line from Dover (England) to Calais (France).
`
from kivy.app import App
from kivy.clock import Clock
from kivy.uix.floatlayout import FloatLayout
from kivy.graphics import Color, Line
from kivy.garden.mapview import MapView, MapLayer
class MapViewApp(App):
mapview = None
def __init__(self, **kwargs):
	super(MapViewApp, self).__init__(**kwargs)
	#self.post()
	Clock.schedule_once(self.post, 0)

def build(self):
	layout = FloatLayout()
	return layout

def post(self, *args):
	self.mapview = MapView(zoom=9, lat=51.046284, lon=1.541179)
	self.mapview.add_layer(LineMapLayer(), mode="scatter")	# window scatter
	self.root.add_widget(self.mapview)

class LineMapLayer(MapLayer):
def init(self, **kwargs):
super(LineMapLayer, self).init(**kwargs)
Clock.schedule_once(self.draw_line, 0)
def draw_line(self, *args):
	geo_dover 	= [51.126251, 1.327067]
	geo_calais 	= [50.959086, 1.827652]
	app = App.get_running_app()
	screen_dover  = app.mapview.get_window_xy_from(geo_dover[0], geo_dover[1], self.parent.zoom)
	screen_calais = app.mapview.get_window_xy_from(geo_calais[0], geo_calais[1], self.parent.zoom)
	point_list    = [ screen_dover[0], screen_dover[1], screen_calais[0], screen_calais[1] ]

	with self.canvas:
		Color(0, 0, 0, .6)
		Line(points=point_list, width=3, joint='bevel')

MapViewApp().run()
`

Yeah I have the same problem on mobile... tried cythonizing and still is slow. Will see if I can figure something out...

I discovered that commenting out this line https://github.com/kivy-garden/garden.mapview/blob/master/mapview/view.py#L647 fixes the scaling issue.  However doing this prevents the map from loading the new tiles when zooming. Still looking for an actual fix...

Got it working with a scatter now. The map resets the scatter transform the zoom level changes, thus the scatter layer must be redrawn in this case. All other movements and scaling within the same zoom level will be taken care of by the scatter.
class LineMapLayer(MapLayer):
    def __init__(self, **kwargs):
        super(LineMapLayer, self).__init__(**kwargs)
        self.zoom = 0

    def reposition(self):
        mapview = self.parent

        #: Must redraw when the zoom changes
        #: as the scatter transform resets for the new tiles
        if (self.zoom != mapview.zoom):
            self.draw_line()

    def draw_line(self, *args):
        mapview = self.parent
        self.zoom = mapview.zoom
        geo_dover   = [51.126251, 1.327067]
        geo_calais  = [50.959086, 1.827652]
        screen_dover  = mapview.get_window_xy_from(geo_dover[0], geo_dover[1], mapview.zoom)
        screen_calais = mapview.get_window_xy_from(geo_calais[0], geo_calais[1], mapview.zoom)

        # When zooming we must undo the current scatter transform
        # or the animation makes the line misplaced
        x,y,s = mapview._scatter.x, mapview._scatter.y, mapview.scale
        point_list    = map(lambda it:it/s,[ screen_dover[0]-x, screen_dover[1]-y,
                                            screen_calais[0]-x, screen_calais[1]-y ])

        with self.canvas:
            self.canvas.clear()
            Color(0, 0, 0, .6)
            Line(points=point_list, width=3, joint="bevel")

Looks great, very needed addition. I will test it when i pick up my project with mapview.
One more thought: do you think it would be faster if instead get_window_xy_from (coordinates..) we could translate geopoints based on transform on zoom level change? I actually had working scatter too, but without resetting it (I scaled line width instead - very dirty solution), it was super fast, but adding new points on zoom/transformation other than default was way over my head (I'd need to reverse track all transformations etc. - it kinda worked, but only on zooming in, on zooming out it was buggy and I couldn't narrow it down - probably applied transformations in wrong order or something and since it was very dirty anyway I gave up on it).

Actually I didn't even think about it but yes you should be able to just apply the same transformations that get_window_xy_from does. Will try it.

I was able to get about a 2x speedup by doing this, however it is breaking the line width drawing algorithm.

import os
import random
from math import *
from mapview.utils import clamp
import time
os.environ['HTTP_PROXY'] = 'http://proxy-us.intel.com:911'

from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.floatlayout import FloatLayout

from kivy.app import App
from kivy.clock import Clock
from kivy.graphics import Color, Line
from kivy.graphics.transformation import Matrix
from kivy.graphics.context_instructions import Translate, Scale
from mapview import MapView, MapLayer, MIN_LONGITUDE, MIN_LATITUDE, MAX_LATITUDE, MAX_LONGITUDE

class MapViewApp(App):
    mapview = None

    def __init__(self, **kwargs):
        super(MapViewApp, self).__init__(**kwargs)
        Clock.schedule_once(self.post, 0)

    def build(self):
        layout = BoxLayout(orientation='vertical')
        return layout

    def post(self, *args):
        layout = FloatLayout()
        self.mapview = MapView(zoom=9, lat=51.046284, lon=1.541179)
        line = LineMapLayer()
        self.mapview.add_layer(line, mode="scatter")  # window scatter
        layout.add_widget(self.mapview)

        self.root.add_widget(layout)
        b = BoxLayout(orientation='horizontal',height='32dp',size_hint_y=None)
        b.add_widget(Button(text="Zoom in",on_press=lambda a: setattr(self.mapview,'zoom',self.mapview.zoom+1)))
        b.add_widget(Button(text="Zoom out",on_press=lambda a: setattr(self.mapview,'zoom',self.mapview.zoom-1)))
        b.add_widget(Button(text="AddPoint",on_press=lambda a: line.add_point()))
        self.root.add_widget(b)

class LineMapLayer(MapLayer):
    def __init__(self, **kwargs):
        super(LineMapLayer, self).__init__(**kwargs)
        self.zoom = 0

        geo_dover   = [51.126251, 1.327067]
        geo_calais  = [50.959086, 1.827652]

        # NOTE: Points must be valid as they're no longer clamped
        self.coordinates = [geo_dover, geo_calais]
        for i in range(25000-2):
            self.coordinates.append(self.gen_point())

    def reposition(self):
        mapview = self.parent

        #: Must redraw when the zoom changes
        #: as the scatter transform resets for the new tiles
        if (self.zoom != mapview.zoom):
            self.draw_line()

    def gen_point(self):
        n = len(self.coordinates)
        dx,dy = random.randint(-100,100)/10000.0,random.randint(0,100)/10000.0
        c = (self.coordinates[-1][0]+dx,
             self.coordinates[-1][1]+dy)

        return c

    def add_point(self):
        #: Add a random point close to the previous one
        for i in range(len(self.coordinates)):
            self.coordinates.append(self.gen_point())
        self.draw_line()

    def get_x(self, lon):
        """Get the x position on the map using this map source's projection
        (0, 0) is located at the top left.
        """
        return clamp(lon, MIN_LONGITUDE, MAX_LONGITUDE)

    def get_y(self, lat):
        """Get the y position on the map using this map source's projection
        (0, 0) is located at the top left.
        """
        lat = clamp(-lat, MIN_LATITUDE, MAX_LATITUDE)
        lat = lat * pi / 180.
        return ((1.0 - log(tan(lat) + 1.0 / cos(lat)) / pi))

    def draw_line(self, *args):
        mapview = self.parent
        self.zoom = mapview.zoom

        # When zooming we must undo the current scatter transform
        # or the animation distorts it
        scatter = mapview._scatter
        map_source = mapview.map_source
        sx,sy,ss = scatter.x, scatter.y, scatter.scale
        vx,vy,vs = mapview.viewport_pos[0], mapview.viewport_pos[1], mapview.scale

        # Account for map source tile size and mapview zoom
        ms = pow(2.0,mapview.zoom) * map_source.dp_tile_size

        #: Since lat is not a linear transform we must compute manually
        line_points = []
        for lat,lon in self.coordinates:
            line_points.extend((self.get_x(lon),self.get_y(lat)))
            #line_points.extend(mapview.get_window_xy_from(lat,lon,mapview.zoom))

        with self.canvas:
            # Clear old line
            self.canvas.clear()

            # Undo the scatter animation transform
            Scale(1/ss,1/ss,1)
            Translate(-sx,-sy)

            # Apply the get window xy from transforms
            Scale(vs,vs,1)
            Translate(-vx,-vy)

            # Apply the what we can factor out
            # of the mapsource long,lat to x,y conversion
            Scale(ms/360.0,ms/2.0,1)
            Translate(180,0)

            # Draw new
            Color(0, 0, 0, .6)
            Line(points=line_points, width=1)#4/ms)#, joint="round",joint_precision=100)

MapViewApp().run()

I'm also interested in this, since I'm implementing in-dash navigation for my car using Kivy. I'm planning on using the Google Maps Directions API to get directions, and display them on the map as vector lines and markers.
Is there anything I can do to help move this feature along aside from testing what's been pasted above?

It seems that Kivy's Line() graphics instruction doesn't do line width very well; it only expands in the y direction, not in x.

(the darker line is with width=1.0, the lighter one is width=0.00002, joint='round', close=False, cap='none')

I was able to get things working faster by precalculating line_points whenever coordinates changes, instead of recalculating it every time we draw.
import random
from math import *

from kivy.graphics import Color, Line, SmoothLine
from kivy.graphics.context_instructions import Translate, Scale
from kivy.garden.mapview.mapview.utils import clamp
from kivy.garden.mapview.mapview import MapLayer, MIN_LONGITUDE, MIN_LATITUDE, MAX_LATITUDE, MAX_LONGITUDE

class LineMapLayer(MapLayer):
    def __init__(self, **kwargs):
        super(LineMapLayer, self).__init__(**kwargs)
        self._coordinates = []
        self.zoom = 0

        geo_dover = [51.126251, 1.327067]
        geo_calais = [50.959086, 0.827652]

        # NOTE: Points must be valid as they're no longer clamped
        coordinates = [geo_dover, geo_calais]
        for i in range(500 - 2):
            coordinates.append(self.gen_point(coordinates[-1]))

        self.coordinates = coordinates

    @property
    def coordinates(self):
        return self._coordinates

    @coordinates.setter
    def coordinates(self, coordinates):
        self._coordinates = coordinates

        #: Since lat is not a linear transform we must compute manually
        self.line_points = [(self.get_x(lon), self.get_y(lat)) for lat, lon in coordinates]
        #self.line_points = [mapview.get_window_xy_from(lat, lon, mapview.zoom) for lat, lon in coordinates]

    def reposition(self):
        mapview = self.parent

        #: Must redraw when the zoom changes
        #: as the scatter transform resets for the new tiles
        if (self.zoom != mapview.zoom):
            self.draw_line()

    def gen_point(self, lastPoint):
        dx, dy = random.randint(-100, 100) / 20000.0, random.randint(0, 100) / 20000.0
        c = (lastPoint[0] + dx, lastPoint[1] + dy)

        return c

    def add_point(self):
        #: Add a random point close to the previous one
        coordinates = self.coordinates
        for i in range(len(self.coordinates)):
            coordinates.append(self.gen_point(coordinates[-1]))
        self.coordinates = coordinates
        self.draw_line()

    def get_x(self, lon):
        '''Get the x position on the map using this map source's projection
        (0, 0) is located at the top left.
        '''
        return clamp(lon, MIN_LONGITUDE, MAX_LONGITUDE) / 180.

    def get_y(self, lat):
        '''Get the y position on the map using this map source's projection
        (0, 0) is located at the top left.
        '''
        lat = clamp(-lat, MIN_LATITUDE, MAX_LATITUDE)
        lat = lat * pi / 180.
        return ((1.0 - log(tan(lat) + 1.0 / cos(lat)) / pi))
        #return ((1.0 - log(tan(lat) + 1.0 / cos(lat)) / pi) * 180.)

    def draw_line(self, *args):
        mapview = self.parent
        self.zoom = mapview.zoom

        # When zooming we must undo the current scatter transform
        # or the animation distorts it
        scatter = mapview._scatter
        map_source = mapview.map_source
        sx, sy, ss = scatter.x, scatter.y, scatter.scale
        vx, vy, vs = mapview.viewport_pos[0], mapview.viewport_pos[1], mapview.scale

        # Account for map source tile size and mapview zoom
        ms = pow(2.0, mapview.zoom) * map_source.dp_tile_size

        with self.canvas:
            # Clear old line
            self.canvas.clear()

            # Undo the scatter animation transform
            Scale(1 / ss, 1 / ss, 1)
            Translate(-sx, -sy)

            # Apply the get window xy from transforms
            Scale(vs, vs, 1)
            Translate(-vx, -vy)

            # Apply the what we can factor out
            # of the mapsource long, lat to x, y conversion
            Scale(ms / 2.0, ms / 2.0, 1)
            Translate(1, 0)

            # Draw new
            Color(0, 0.2, 0.7, 0.25)
            Line(points=self.line_points, width=6.5 / ms)
            Color(0, 0.2, 0.7, 1)
            Line(points=self.line_points, width=6 / ms)
            Color(0, 0.3, 1, 1)
            Line(points=self.line_points, width=4 / ms)
            #Line(points=self.line_points, width=1)#4 / ms)#, joint='round', joint_precision=100)
            #Line(points=self.line_points, width=4 / ms, joint='round', close=False, cap='none')
            #Line(points=self.line_points, width=1)

The offset seems to be because the MapView is not positioned at (0, 0) in the window; I have it in a PageLayout. So, the drawing routine for the lines should apparently take the MapView's position into account when rendering.

This is working much better:
from datetime import datetime
import random
from math import *
from pprint import pprint

from kivy.graphics import Color, Line, SmoothLine, MatrixInstruction
from kivy.graphics.context_instructions import Translate, Scale
from kivy.clock import Clock

from kivy.garden.mapview.mapview.utils import clamp
from kivy.garden.mapview.mapview import MapLayer, MIN_LONGITUDE, MIN_LATITUDE, MAX_LATITUDE, MAX_LONGITUDE

import googlemaps
import polyline

with open('google-maps-directions.apikey', 'r') as f:
    mapsAPIKey = f.read()

class LineMapLayer(MapLayer):
    def __init__(self, **kwargs):
        super(LineMapLayer, self).__init__(**kwargs)
        self._coordinates = []
        self._line_points = None
        self._line_points_offset = (0, 0)
        self.zoom = 0

        self.add_nav_coords()
        self.clear_and_redraw()

    @property
    def coordinates(self):
        return self._coordinates

    @coordinates.setter
    def coordinates(self, coordinates):
        self._coordinates = coordinates
        self.invalidate_line_points()

    @property
    def line_points(self):
        if self._line_points is None:
            self.calc_line_points()
        return self._line_points

    @property
    def line_points_offset(self):
        if self._line_points is None:
            self.calc_line_points()
        return self._line_points_offset

    def calc_line_points(self):
        # Offset all points by the coordinates of the first point, to keep coordinates closer to zero.
        # (and therefore avoid some float precision issues when drawing lines)
        self._line_points_offset = (self.get_x(self.coordinates[0][1]), self.get_y(self.coordinates[0][0]))
        # Since lat is not a linear transform we must compute manually
        self._line_points = [(self.get_x(lon) - self._line_points_offset[0], self.get_y(lat) - self._line_points_offset[1]) for lat, lon in self.coordinates]

    def invalidate_line_points(self):
        self._line_points = None
        self._line_points_offset = (0, 0)

    def get_x(self, lon):
        '''Get the x position on the map using this map source's projection
        (0, 0) is located at the top left.
        '''
        return clamp(lon, MIN_LONGITUDE, MAX_LONGITUDE) * self.ms / 360.0

    def get_y(self, lat):
        '''Get the y position on the map using this map source's projection
        (0, 0) is located at the top left.
        '''
        lat = radians(clamp(-lat, MIN_LATITUDE, MAX_LATITUDE))
        return ((1.0 - log(tan(lat) + 1.0 / cos(lat)) / pi)) * self.ms / 2.0

    def reposition(self):
        mapview = self.parent

        # Must redraw when the zoom changes
        # as the scatter transform resets for the new tiles
        if (self.zoom != mapview.zoom):
            map_source = mapview.map_source
            self.ms = pow(2.0, mapview.zoom) * map_source.dp_tile_size
            self.invalidate_line_points()
            self.clear_and_redraw()

    def add_nav_coords(self):
        gmaps = googlemaps.Client(key=mapsAPIKey)
        now = datetime.now()
        routes = gmaps.directions(
            '100 broad st weymouth ma',
            'rice passions malden ma',
            mode='driving',
            departure_time=now
        )
        self.coordinates = polyline.decode(routes[0]['overview_polyline']['points'])

    def clear_and_redraw(self, *args):
        with self.canvas:
            # Clear old line
            self.canvas.clear()

        # FIXME: Why is 0.05 a good value here? Why does 0 leave us with weird offsets?
        Clock.schedule_once(self._draw_line, 0.05)

    def _draw_line(self, *args):
        mapview = self.parent
        self.zoom = mapview.zoom

        # When zooming we must undo the current scatter transform
        # or the animation distorts it
        scatter = mapview._scatter
        sx, sy, ss = scatter.x, scatter.y, scatter.scale

        # Account for map source tile size and mapview zoom
        vx, vy, vs = mapview.viewport_pos[0], mapview.viewport_pos[1], mapview.scale

        with self.canvas:
            # Clear old line
            self.canvas.clear()

            # Offset by the MapView's position in the window
            Translate(*mapview.pos)

            # Undo the scatter animation transform
            Scale(1 / ss, 1 / ss, 1)
            Translate(-sx, -sy)

            # Apply the get window xy from transforms
            Scale(vs, vs, 1)
            Translate(-vx, -vy)

            # Apply the what we can factor out of the mapsource long, lat to x, y conversion
            Translate(self.ms / 2, 0)

            # Translate by the offset of the line points (this keeps the points closer to the origin)
            Translate(*self.line_points_offset)

            # Draw line
            Color(0, 0.2, 0.7, 0.25)
            Line(points=self.line_points, width=6.5 / 2)
            Color(0, 0.2, 0.7, 1)
            Line(points=self.line_points, width=6 / 2)
            Color(0, 0.3, 1, 1)
            Line(points=self.line_points, width=4 / 2)

This makes several changes from the last version:

Instead of the test points above, this uses the Google Maps Directions API to populate the coordinates list, so you'll need an API key for it. You can get one for free at https://developers.google.com/maps/documentation/directions/
All coordinates are offset to be relative to the first coordinate, and the first coordinate is used in a Translate() while drawing. This prevents float imprecision issues while rendering. (provided your line isn't too large; it might be better to offset relative to the center of the viewport, but that would require re-calculating line_points every frame, or having some sort of distance threshold which triggers a re-calculation)
We use mapview.pos to translate the drawing, so it actually lines up with the map most of the time.
We delay drawing by 0.05 seconds. Apparently this gives the other transforms a chance to settle so the line doesn't end up being weirdly offset. (still don't understand the mechanics here, though)

This performs rather well (although there's some visible lag when zooming in or out before it redraws, but I think that's unavoidable as long as there's a Scatter animation present) and it looks equally good zoomed in or out.
There's only one big problem here:

After zooming too far in or too far out, the line becomes permanently offset to the east. I'm not sure, but I think it might have something to do with how MapView handles its Scatter.

sx, sy, ss = scatter.x - mapview.x, scatter.y - mapview.y, scatter.scale
instead of
Translate(*mapview.pos)
also works

This is working much better:
from math import *

from kivy.graphics import Color, Line, SmoothLine, MatrixInstruction
from kivy.graphics.context_instructions import Translate, Scale
from kivy.clock import Clock

from kivy.garden.mapview.mapview.utils import clamp
from kivy.garden.mapview.mapview import MapLayer, MIN_LONGITUDE, MIN_LATITUDE, MAX_LATITUDE, MAX_LONGITUDE

class LineMapLayer(MapLayer):
    def __init__(self, **kwargs):
        super(LineMapLayer, self).__init__(**kwargs)
        self._coordinates = []
        self._line_points = None
        self._line_points_offset = (0, 0)
        self.zoom = 0

    @property
    def coordinates(self):
        return self._coordinates

    @coordinates.setter
    def coordinates(self, coordinates):
        self._coordinates = coordinates
        self.invalidate_line_points()
        self.clear_and_redraw()

    @property
    def line_points(self):
        if self._line_points is None:
            self.calc_line_points()
        return self._line_points

    @property
    def line_points_offset(self):
        if self._line_points is None:
            self.calc_line_points()
        return self._line_points_offset

    def calc_line_points(self):
        # Offset all points by the coordinates of the first point, to keep coordinates closer to zero.
        # (and therefore avoid some float precision issues when drawing lines)
        self._line_points_offset = (self.get_x(self.coordinates[0][1]), self.get_y(self.coordinates[0][0]))
        # Since lat is not a linear transform we must compute manually
        self._line_points = [(self.get_x(lon) - self._line_points_offset[0], self.get_y(lat) - self._line_points_offset[1]) for lat, lon in self.coordinates]

    def invalidate_line_points(self):
        self._line_points = None
        self._line_points_offset = (0, 0)

    def get_x(self, lon):
        '''Get the x position on the map using this map source's projection
        (0, 0) is located at the top left.
        '''
        return clamp(lon, MIN_LONGITUDE, MAX_LONGITUDE) * self.ms / 360.0

    def get_y(self, lat):
        '''Get the y position on the map using this map source's projection
        (0, 0) is located at the top left.
        '''
        lat = radians(clamp(-lat, MIN_LATITUDE, MAX_LATITUDE))
        return ((1.0 - log(tan(lat) + 1.0 / cos(lat)) / pi)) * self.ms / 2.0

    def reposition(self):
        mapview = self.parent

        # Must redraw when the zoom changes
        # as the scatter transform resets for the new tiles
        if (self.zoom != mapview.zoom):
            map_source = mapview.map_source
            self.ms = pow(2.0, mapview.zoom) * map_source.dp_tile_size
            self.invalidate_line_points()
            self.clear_and_redraw()

    def clear_and_redraw(self, *args):
        with self.canvas:
            # Clear old line
            self.canvas.clear()

        # FIXME: Why is 0.05 a good value here? Why does 0 leave us with weird offsets?
        Clock.schedule_once(self._draw_line, 0.05)

    def _draw_line(self, *args):
        mapview = self.parent
        self.zoom = mapview.zoom

        # When zooming we must undo the current scatter transform
        # or the animation distorts it
        scatter = mapview._scatter
        sx, sy, ss = scatter.x, scatter.y, scatter.scale

        # Account for map source tile size and mapview zoom
        vx, vy, vs = mapview.viewport_pos[0], mapview.viewport_pos[1], mapview.scale

        with self.canvas:
            # Clear old line
            self.canvas.clear()

            # Offset by the MapView's position in the window
            Translate(*mapview.pos)

            # Undo the scatter animation transform
            Scale(1 / ss, 1 / ss, 1)
            Translate(-sx, -sy)

            # Apply the get window xy from transforms
            Scale(vs, vs, 1)
            Translate(-vx, -vy)

            # Apply the what we can factor out of the mapsource long, lat to x, y conversion
            Translate(self.ms / 2, 0)

            # Translate by the offset of the line points (this keeps the points closer to the origin)
            Translate(*self.line_points_offset)

            # Draw line
            Color(0, 0.2, 0.7, 0.25)
            Line(points=self.line_points, width=6.5 / 2)
            Color(0, 0.2, 0.7, 1)
            Line(points=self.line_points, width=6 / 2)
            Color(0, 0.3, 1, 1)
            Line(points=self.line_points, width=4 / 2)

This makes several changes from the last version:

I removed the test points, since now you can set line.coordinates to any array of coordinates you want.
All coordinates are offset to be relative to the first coordinate, and the first coordinate is used in a Translate() while drawing. This prevents float imprecision issues while rendering. (provided your line isn't too large; it might be better to offset relative to the center of the viewport, but that would require re-calculating line_points every frame, or having some sort of distance threshold which triggers a re-calculation)
We use mapview.pos to translate the drawing, so it actually lines up with the map most of the time.
We delay drawing by 0.05 seconds. Apparently this gives the other transforms a chance to settle so the line doesn't end up being weirdly offset. (still don't understand the mechanics here, though)

This performs rather well (although there's some visible lag when zooming in or out before it redraws, but I think that's unavoidable as long as there's a Scatter animation present) and it looks equally good zoomed in or out.
There's only one big problem here:

After zooming too far in or too far out, the line becomes permanently offset to the east. I'm not sure, but I think it might have something to do with how MapView handles its Scatter.

Can you please attach MapViewApp Class that run the map?


Enhancing Helm Chart lifecycle

Closes #155.
Secret resources are going to be created only at installation and removed using the pre-delete hook thas has been improved as the post-install one.

@prometherion Everything looks good. The only thing I'm worried about is moving helmHook commands to values.yaml file. I don't think that they should be modified by user, so maybe it's better to move them into helpers?

Thanks for the feedback, @MaxFedotov.
The reason behind putting the command into the values file was to make it more readable, and it's not intended to be modified by the end-user.
If it doesn't make sense, I'll put them back into the Helm template.

The reason behind putting the command into the values file was to make it more readable, and it's not intended to be modified by the end-user.
Yeah, I understand :) But for me, values are something, that I can tune for my env when I'm running deployment. How do you think, will it be possible to move this into _helpers file?

Defo, going to put into Helpers.

@MaxFedotov please, review squashed commit: rather than Helpers, since this is going to used just into the template, defined as variable there: WDYT?


Psychonomics 2020: Power simulations for linguistic norm data collection

Type: Talk
Title: Power simulations for linguistic norm data collection
Session types: Language: semantics, Language: psycholinguistics
Authors:

Erin M. Buchanan<EMAIL_ADDRESS>Harrisburg University of Science and Technology
K.D. Valentine<EMAIL_ADDRESS>Massachusetts General Hospital
Nicholas Maxwell<EMAIL_ADDRESS>University of Southern Mississippi
Jack E. Taylor<EMAIL_ADDRESS>University of Glasgow
(others as added by their approval)

Abstract (1250 characters max):
The current focus on replication and reproducibility has driven a need to adequately power studies through appropriate sample size planning. However, estimating power and sample size is usually driven by the choice of hypothesis test and research design. An incredible number of psycholinguistic database norms have been published in the last ten years, and the issues of power and sample size have largely been ignored, as these studies do not use hypothesis testing as a main objective. This presentation will discuss how to use accuracy in parameter estimation (AIPE) and qualitative coverage approaches to determine the appropriate number of participants for data collection in a study with no hypothesis test. Data from English feature production norms, the English Lexicon Project, and the Semantic Priming Project will be used to demonstrate how to estimate variable sample sizes by item for both qualitative (feature production norms) and quantitative (priming, lexical decision tasks) type data.

Hi Erin, thank you so much for putting this together!
The abstract sounds really great!
I was wondering if it could be possible to extend AIPE to rating norms. If I think affective ratings (like valence, arousal, dominance), I'm not sure it could be possible given the expected high variability in participants' judgments. But, what do you think about lexical-semantic measures, like concreteness, mode of acquisition, imageability and so forth, which seem more "objective" measures (so with less individual variability)?

@MarMon83 - great question - definitely we can add it to the paper, and I'll add it to the presentation too. I'm unsure if one of those is more difficult than the other - mainly, I think the confidence interval or SE would be a larger for the more variable ones, but that's a good question we can test in the paper.


Kivy is incompatible with newer Pillow versions (>=10), and we are currently pinning version 9.5.x

Software Versions

Python: 3.11.6
OS: Windows 11 Pro 22H2
Kivy: 2.2.1
Kivy installation method: python -m pip install "kivy[base]"
Pillow: 10.1.0

Describe the bug
I tried to run the simple kivy example on windows. Something seems to be wrong with the kivy installation. Not sure if this is a real bug, but I strictly follow the installation guide. So it seems to me there might be a way to get a broken installation. If I downgrade the version of Pillow to 9.5. Everything works again.
Expected behavior
No error when executing an example from the documentation. The app that I was originally debugging simply froze and no error could be seen in the ouput log,
To Reproduce

create and activate virtual environment
install kivy with python -m pip install "kivy[base]"
copy example from https://kivy.org/doc/stable/guide/basic.html into a file main.py and change version number in source to 2.2.1
run code

Code and Logs and screenshots
The complete output is in this  gist.
import kivy
kivy.require('2.2.1') # replace with your current kivy version !

from kivy.app import App
from kivy.uix.label import Label

class MyApp(App):

    def build(self):
        return Label(text='Hello world')

if __name__ == '__main__':
    MyApp().run()

the error message I get is:
[INFO   ] [Base        ] Leaving application in progress...
 Traceback (most recent call last):
   File "C:\Users\lucas\kivytest\main.py", line 15, in <module>
     MyApp().run()
   File "C:\Users\lucas\kivytest\venv\Lib\site-packages\kivy\app.py", line 956, in run
     runTouchApp()
   File "C:\Users\lucas\kivytest\venv\Lib\site-packages\kivy\base.py", line 574, in runTouchApp
     EventLoop.mainloop()
   File "C:\Users\lucas\kivytest\venv\Lib\site-packages\kivy\base.py", line 339, in mainloop
     self.idle()
   File "C:\Users\lucas\kivytest\venv\Lib\site-packages\kivy\base.py", line 379, in idle
     Clock.tick()
   File "C:\Users\lucas\kivytest\venv\Lib\site-packages\kivy\clock.py", line 733, in tick
     self.post_idle(ts, self.idle())
   File "C:\Users\lucas\kivytest\venv\Lib\site-packages\kivy\clock.py", line 776, in post_idle
     self._process_events()
   File "kivy\_clock.pyx", line 620, in kivy._clock.CyClockBase._process_events
   File "kivy\_clock.pyx", line 653, in kivy._clock.CyClockBase._process_events
   File "kivy\_clock.pyx", line 649, in kivy._clock.CyClockBase._process_events
   File "kivy\_clock.pyx", line 218, in kivy._clock.ClockEvent.tick
   File "C:\Users\lucas\kivytest\venv\Lib\site-packages\kivy\uix\label.py", line 431, in texture_update
     self._label.refresh()
   File "C:\Users\lucas\kivytest\venv\Lib\site-packages\kivy\core\text\__init__.py", line 823, in refresh
     sz = self.render()
          ^^^^^^^^^^^^^
   File "C:\Users\lucas\kivytest\venv\Lib\site-packages\kivy\core\text\__init__.py", line 759, in render
     options['space_width'] = self.get_extents(' ')[0]
                              ^^^^^^^^^^^^^^^^^^^^^
   File "C:\Users\lucas\kivytest\venv\Lib\site-packages\kivy\core\text\text_pil.py", line 37, in get_extents
     w, h = font.getsize(text)
            ^^^^^^^^^^^^
 AttributeError: 'FreeTypeFont' object has no attribute 'getsize'

Possible solution: Downgrading Pillow
I found this thread
Which also seems to work for kivy.
(venv) PS C:\Users\lucas\kivytest> pip uninstall pillow
Found existing installation: Pillow 10.1.0
Uninstalling Pillow-10.1.0:
  Would remove:
    c:\users\lucas\kivytest\venv\lib\site-packages\pil\*
    c:\users\lucas\kivytest\venv\lib\site-packages\pillow-10.1.0.dist-info\*
Proceed (Y/n)? Y
  Successfully uninstalled Pillow-10.1.0
(venv) PS C:\Users\lucas\kivytest> pip install Pillow==9.5.0
Collecting Pillow==9.5.0
  Downloading Pillow-9.5.0-cp311-cp311-win_amd64.whl (2.5 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.5/2.5 MB 3.6 MB/s eta 0:00:00
Installing collected packages: Pillow
Successfully installed Pillow-9.5.0

Afterwards the example code works.

So, looking into it. It seems this issue has been fixed in the main branch. https://github.com/kivy/kivy/commit/5585b2410b70d75158fcf4d6d6227aa7971f2679

Hi @lucasgerads !
I'm not closing this issue (even if we have a fix on master branch) as we need to track that down, as we will need to increase the release version future.
However, regarding the minor fix: As soon an external dependency we are waiting to is ready, we will start the release process for 2.3.0.

Related:
kivy-ios build 8.2.0
https://github.com/kivy/kivy-ios/blob/master/kivy_ios/recipes/pillow/__init__.py#L8
p4a builds 8.4.0
https://github.com/kivy/python-for-android/blob/develop/pythonforandroid/recipes/Pillow/__init__.py#L26

This issue is not there with Pillow 10.1.0 outside of a virtual environment (venv).

I found the comments above rather misleading, so I am restating the problem.
Kivy's text_pil.py has the functions get_extents() and get_cached_extents() that call Pillow's getsize() on a font.
Pillow has deprecated this since 9.2 (which was only July 2022) and removed it in Pillow 10.0 (July 2023).
We should be using FreeTypeFont.getbbox() instead.
The "solution" in the main branch (https://github.com/kivy/kivy/commit/5585b2410b70d75158fcf4d6d6227aa7971f2679) isn't a fix; it is a temporary work-around. It pins to the old version of Pillow.
That should be replaced with either using only getbbox() [which means only working on Pillow >=9.2] or adapting based on which functions are available [to allow it to work with both >=10 or <= 9.2 or in-between].
The version can then be unpinned.
Meanwhile, the kivy-ios and p4a recipes are hardcoded to Pillow 8.2 and 8.4 respectively. They should be updated. (In an ideal world, handling several versions.)
Finally, I don't understand the comment that this works in Pillow 10.1.0. That seems impossible. I don't know if I am missing something.

Just tried with the following crude test,  things seem to work with KIVY_TEXT=pil and latest pillow.
kivy % git diff
diff --git a/kivy/core/text/text_pil.py b/kivy/core/text/text_pil.py
index 6549166b4..3d53d3d0a 100644
--- a/kivy/core/text/text_pil.py
+++ b/kivy/core/text/text_pil.py
@@ -34,11 +34,16 @@ class LabelPIL(LabelBase):

     def get_extents(self, text):
         font = self._select_font()
-        w, h = font.getsize(text)
+        try:
+            w, h = font.getsize(text)
+        except AttributeError:
+            left, top, right, bottom = font.getbbox(text)
+            w = right - left
+            h = bottom
         return w, h

     def get_cached_extents(self):
-        return self._select_font().getsize
+        return self.get_extents

     def _render_begin(self):
         # create a surface, context, font...

Will investigate further as this needs a few tests to make sure we are getting correct height/width etc

This is a blocker for the next release, as Pillow < 10 does not have any Python 3.12 pre-built artifact.
And, Pillow < 10 is also affected by numerous security issues.
But, we need to support both Pillow>=10 and Pillow<10 as win32 wheels for Pillow>=10 are not available.
For win32 and win_amd64 only, a cp312-cp312 wheel for 9.5.0 has been published on PyPI, so win32 can be still supported on our side, if we support both Pillow versions.
@akshayaurora do you need some testing?


Fix Inconsistent tests

@myckhel Hallo, how are you? Do you need help with something? I might have some time available!!

@hmreumann is Back 😄 .
When you run composer test sometimes the test fails sometimes it passes.
example failure https://github.com/myckhel/laravel-chat-system/runs/4200726413?check_suite_focus=true
This needs debugging to fix.
I can assign to you if you wanna try debug.

Sure @myckhel It is going to be good for me to try Pest

Thanks @hmreumann for your efforts


Update version.py to 0.4.1

Summary
fixes common issue from documentation
Details and comments
asap release

I'm afraid if we add a silently upgrade to harmony it will be hard to notice that it's happening / it might cause further issues down the line if we decomission harmony, or if we do end up using an 'ionq_qpu' meta-target again.
Can we print a warning?

I'm afraid if we add a silently upgrade to harmony it will be hard to notice that it's happening / it might cause further issues down the line if we decomission harmony, or if we do end up using an 'ionq_qpu' meta-target again.
Can we print a warning?

got it thanks!


feat: Add promotion support for pipelines

Adds support for automatically detecting an app in a pipeline and use promotion when possible.

This seems to add a few new outputs so specify that in the readme

These are internal outputs used by other steps, not exposed to any consumer so nothing to document there :)