Tap using Class / Xpath

OpenTest version number: 1.0.5
I want to tap on the screen in a area that has no ID/xpath. Is it possible for me to tap a class or the packageID using Opentest? If so how?

In case you need to tap an area of the screen that cannot be identified through a locator, you have two options:

Option 1, is tapping the screen at absolute coordinates. This is the most simple and tempting option, but is not the most stable, since the coordinates to tap at might be different base on the screen resolution. In case you need to take this option, the syntax is:

- description: Tap at screen coordinates (200,200)
  action: org.getopentest.appium.Tap
  args:
    x: 200
    y: 200

Option 2 is to tap relative to the top-left corner of another UI element that you can identify using a locator. The trick is to find an element whose position relative to the element you want to tap is guaranteed to remain the same, even as the screen resolution changes. The syntax to do this type of tap is:

- description: Tap on first product
  action: org.getopentest.appium.Tap
  args:
    locator: { id: product1 }
    xOffset: 20
    yOffset: 20

Please note that you'll need to upgrade to the latest version of OpenTest (1.0.7) for the syntax above to work. Previous versions don't have the tap at relative coordinates feature, and the tap at absolute coordinates was not properly implemented.
Both examples above are copied from the documentation.


Fairyfloss not working in IntelliJ anymore

Since a few weeks back, I'm seeing a basic light theme for the opened file and terminal. The fairyfloss theme is still functional for the file tree and borders. I tried in IntelliJ 2023.3 as well as IntelliJ 2023.2.

Not an issue with theme, I had the wrong setup in Settings -> Editor -> Color Scheme -> General under "Scheme".


Run linter after watch

As long as it doesn't crash everything it should def. be linting while you work

Adding gulp.watch(jsWatchFiles.concat(otherWatchFiles), ['lint-src', 'lint-test']); to the testBrowser method works well...but only once. After you make a change, it never runs again. Still trying to figure that one out :)

Gonna mark this as blocked by #230 since Browserify is breaking it.

Resolved in #259


Cant reduce height with custom styles

I'm trying to achieve something like this (see attached image) using your component, but I can't seem to reduce the height the custom gradient takes up? Is it possible to achieve something like this using your package? Seems it's not so easily customizable

You can supply your own function to render items just as you see fit - including making them smaller. It is not yet, however, possible to show the next slide "peeking" in.


Add Feature Lines as Corridor Baselines

Hello Paolo,
Add Feature Lines as Corridor Baselines
By Name, By Selection or By Site
Thank you for your time and efforts

There is no API at the moment to do that.

Thank you for your clarification.
Anyway. this toolkit is brilliant. Fantastic job!!!

thank you


For MAUI see here....

It does not look like this library is going to be updated to MAUI, see below some resources for a rewrite.
https://github.com/jonathanpeppers/glidex/issues/106

If you currently using FFImageLoading and moving to MAUI you probably also want to check out these resources.
https://www.youtube.com/watch?v=fdL-3mhUThY&ab_channel=JamesMontemagno
For iOS this looks like a great option:
https://github.com/roubachof/Xamarin.Forms.Nuke/issues/29
If anyone knows of a way to replicate the FFImageLoading "Image retries & retry delay" on images plse post back here.

Thanks @Redth for release a version for MAUI -> https://www.nuget.org/packages/FFImageLoadingCompat.Maui

As the Compat version seems not maintained.
We now use this Fork: https://github.com/microspaze/FFImageLoading.Maui - https://www.nuget.org/packages/FFImageLoading.Maui
=> Several bug fixes and recent updates


Support to use Casbin policy from DB

Right now we only support CSV file: https://github.com/casbin-lua/kong-authz#configuration
Need to support DB like other languages.
We already have adapters like: https://github.com/casbin-lua?q=adapter&type=all&language=&sort=

The question is how to let this kong-authz plugin to use the above adapters to connect to DB

I want try.

@conghuhu go ahead!


Core: Inconsistency when adding Descriptions to descgate

While working on #517 I discovered an inconsistent behavior when handling type names and type descriptors for publishers and Subscribers:

CPublisher::Create properly adds the topic typename and description to the internal database (descgate). However, the user is allowed to leave either one or both of them two empty. If empty, they may be overwritten in the database by external data (from the current implementation).
https://github.com/eclipse-ecal/ecal/blob/218d0625a98282a71a63f459cb8b4ef601c0288b/ecal/core/src/pubsub/ecal_publisher.cpp#L154

CPublisher::SetDescription does not update the internal Descriptor database. It only sends out the description via a "Sample", i.e. it sends it out via UDP.
https://github.com/eclipse-ecal/ecal/blob/218d0625a98282a71a63f459cb8b4ef601c0288b/ecal/core/src/pubsub/ecal_publisher.cpp#L196

CPublisher::SetTypeName does not exist at all.

The CSubscriber works the same, but it doesn't support setting a description after creation at all.
@rex-schilasky Is this inconsistent behavior intended?

Rex told me there isn't, so I am changing it.

Solved with PR #783.


Bad Merge of Kinetic Merge Repository.

Version
1.1.1
Reproduction
git clone git@github.com:sageserpent-open/kineticMerge.git bugReproductionForKineticMerge
cd bugReproductionForKineticMerge
git checkout -b ourBranch problemMergeOurSide

<path to Kinetic Merge>/kinetic-merge --no-commit problemMergeTheirSide

git status

That command sequence yields the output:
Conflict - file .../bugReproductionForKineticMerge/src/main/scala/com/sageserpent/kineticmerge/core/CodeMotionAnalysis.scala was modified on our branch ourBranch and modified on their branch problemMergeTheirSide.
Merge conflicts found, handing over for manual resolution...

On branch ourBranch
You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Changes to be committed:
	modified:   .gitignore
	modified:   src/main/scala/com/sageserpent/kineticmerge/ProgressRecording.scala

Unmerged paths:
  (use "git add <file>..." to mark resolution)
	both modified:   src/main/scala/com/sageserpent/kineticmerge/core/CodeMotionAnalysis.scala

Expected Behaviour
It would have been nice to get a clean merge, but even a conflicted merge with a few minor tweaks required would be OK. What results is much worse...
First, the good news - the changes on our side are a refactoring, making the method defined in the class MatchesAndTheirSections.withAllMatchesOfAtLeastTheSureFireWindowSize into a factory method of the same name within the companion object. On the other side there are various changes made in the body of the method in its original location.
These changes made on the other side merge seamlessly into the moved method's new location. Great!
However, the rest of the file is mangled:

The method cleanedUp is duplicated, but with a stray intervening run of text \t\tprivate def as a prefix of the second of the duplicates.
There is a conflict much further down:

<<<<<<< ourBranch
    end MatchesAndTheirSections
=======
    private def end MatchesAndTheirSections
>>>>>>> problemMergeTheirSide

Manually editing out these problems and compiling reveals that the methods MatchesAndTheirSections.withoutTheseMatches and MatchesAndTheirSections.withMatches have vanished!

Staging the conflicted merged file and doing a diff yields this:
diff --git a/src/main/scala/com/sageserpent/kineticmerge/core/CodeMotionAnalysis.scala b/src/main/scala/com/sageserpent/kineticmerge/core/CodeMotionAnalysis.scala
index eb9bc0b..b4d8b49 100644
--- a/src/main/scala/com/sageserpent/kineticmerge/core/CodeMotionAnalysis.scala
+++ b/src/main/scala/com/sageserpent/kineticmerge/core/CodeMotionAnalysis.scala
@@ -140,15 +140,11 @@ object CodeMotionAnalysis extends StrictLogging:
         Caffeine.newBuilder().build()

       def withAllMatchesOfAtLeastTheSureFireWindowSize() =
-        def progressForMatchSize(matchSize: Int): Int =
-          maximumFileSizeAcrossAllFilesOverAllSides - matchSize
-
         Using(
           progressRecording.newSession(
-            progressForMatchSize(
-              minimumSureFireWindowSizeAcrossAllFilesOverAllSides
-            )
-          )
+            label = "Minimum match size considered:",
+            maximumProgress = maximumFileSizeAcrossAllFilesOverAllSides
+          )(initialProgress = maximumFileSizeAcrossAllFilesOverAllSides)
         ) { progressRecordingSession =>
           @tailrec
           def withAllMatchesOfAtLeastTheSureFireWindowSize(
@@ -225,8 +221,7 @@ object CodeMotionAnalysis extends StrictLogging:
                       s"Search has found an optimal match at window size: $candidateWindowSize, number of matches is: $numberOfMatchesForTheGivenWindowSize, restarting search to look for smaller matches."
                     )
                     progressRecordingSession.upTo(
-                      progressForMatchSize(candidateWindowSize)
-                    )
+                      candidateWindowSize)
                     withAllMatchesOfAtLeastTheSureFireWindowSize(
                       stateAfterTryingCandidate,
                       looseExclusiveUpperBoundOnMaximumMatchSize =
@@ -252,9 +247,7 @@ object CodeMotionAnalysis extends StrictLogging:
                   s"Search for matches whose size is no less than the sure-fire match window size of: $minimumSureFireWindowSizeAcrossAllFilesOverAllSides has terminated; results are:\n${pprintCustomised(fallbackImprovedState)}"
                 )
                 progressRecordingSession.upTo(
-                  progressForMatchSize(
-                    minimumSureFireWindowSizeAcrossAllFilesOverAllSides
-                  )
+                  minimumSureFireWindowSizeAcrossAllFilesOverAllSides
                 )
                 fallbackImprovedState
               else
@@ -266,8 +259,7 @@ object CodeMotionAnalysis extends StrictLogging:
                   s"Search has found optimal matches at window size: $bestMatchSize, restarting search to look for smaller matches."
                 )
                 progressRecordingSession.upTo(
-                  progressForMatchSize(bestMatchSize)
-                )
+                  bestMatchSize)
                 withAllMatchesOfAtLeastTheSureFireWindowSize(
                   fallbackImprovedState,
                   looseExclusiveUpperBoundOnMaximumMatchSize = bestMatchSize
@@ -788,231 +780,35 @@ object CodeMotionAnalysis extends StrictLogging:
           .matchesAndTheirSections
       end withPairwiseMatchesEatenInto

-      private def withoutTheseMatches(
-          matches: Iterable[Match[Section[Element]]]
-      ): MatchesAndTheirSections =
-        matches.foldLeft(this) {
-          case (
-                matchesAndTheirSections,
-                allSides @ Match.AllSides(
-                  baseSection,
-                  leftSection,
-                  rightSection
-                )
-              ) =>
-            val basePath  = base.pathFor(baseSection)
-            val leftPath  = left.pathFor(leftSection)
-            val rightPath = right.pathFor(rightSection)
-            matchesAndTheirSections
-              .focus(_.baseSectionsByPath)
-              .modify(_.updatedWith(basePath) { case Some(sectionsSeen) =>
-                Some(sectionsSeen - baseSection)
-              })
-              .focus(_.leftSectionsByPath)
-              .modify(_.updatedWith(leftPath) { case Some(sectionsSeen) =>
-                Some(sectionsSeen - leftSection)
-              })
-              .focus(_.rightSectionsByPath)
-              .modify(_.updatedWith(rightPath) { case Some(sectionsSeen) =>
-                Some(sectionsSeen - rightSection)
-              })
-              .focus(_.sectionsAndTheirMatches)
-              .modify(
-                _.remove(baseSection, allSides)
-                  .remove(leftSection, allSides)
-                  .remove(rightSection, allSides)
-              )
-
-          case (
-                matchesAndTheirSections,
-                baseAndLeft @ Match.BaseAndLeft(baseSection, leftSection)
-              ) =>
-            val basePath = base.pathFor(baseSection)
-            val leftPath = left.pathFor(leftSection)
-            matchesAndTheirSections
-              .focus(_.baseSectionsByPath)
-              .modify(_.updatedWith(basePath) { case Some(sectionsSeen) =>
-                Some(sectionsSeen - baseSection)
-              })
-              .focus(_.leftSectionsByPath)
-              .modify(_.updatedWith(leftPath) { case Some(sectionsSeen) =>
-                Some(sectionsSeen - leftSection)
-              })
-              .focus(_.sectionsAndTheirMatches)
-              .modify(
-                _.remove(baseSection, baseAndLeft)
-                  .remove(leftSection, baseAndLeft)
-              )
-
-          case (
-                matchesAndTheirSections,
-                baseAndRight @ Match.BaseAndRight(baseSection, rightSection)
-              ) =>
-            val basePath  = base.pathFor(baseSection)
-            val rightPath = right.pathFor(rightSection)
-            matchesAndTheirSections
-              .focus(_.baseSectionsByPath)
-              .modify(_.updatedWith(basePath) { case Some(sectionsSeen) =>
-                Some(sectionsSeen - baseSection)
-              })
-              .focus(_.rightSectionsByPath)
-              .modify(_.updatedWith(rightPath) { case Some(sectionsSeen) =>
-                Some(sectionsSeen - rightSection)
-              })
-              .focus(_.sectionsAndTheirMatches)
-              .modify(
-                _.remove(baseSection, baseAndRight)
-                  .remove(rightSection, baseAndRight)
-              )
-
-          case (
-                matchesAndTheirSections,
-                leftAndRight @ Match.LeftAndRight(leftSection, rightSection)
-              ) =>
-            val leftPath  = left.pathFor(leftSection)
-            val rightPath = right.pathFor(rightSection)
-            matchesAndTheirSections
-              .focus(_.leftSectionsByPath)
-              .modify(_.updatedWith(leftPath) { case Some(sectionsSeen) =>
-                Some(sectionsSeen - leftSection)
-              })
-              .focus(_.rightSectionsByPath)
-              .modify(_.updatedWith(rightPath) { case Some(sectionsSeen) =>
-                Some(sectionsSeen - rightSection)
-              })
-              .focus(_.sectionsAndTheirMatches)
-              .modify(
-                _.remove(leftSection, leftAndRight)
-                  .remove(rightSection, leftAndRight)
-              )
-        }
-      end withoutTheseMatches
-
-      private def withMatches(
-          matches: collection.Set[Match[Section[Element]]]
-      ): MatchingResult =
-        val (
-          updatedMatchesAndTheirSections,
-          matchesWithoutRedundantPairwiseMatches
-        ) =
-          matches
-            .foldLeft(this)(_.withMatch(_))
-            .withoutRedundantPairwiseMatchesIn(matches)
-
-        MatchingResult(
-          matchesAndTheirSections = updatedMatchesAndTheirSections,
-          numberOfMatchesForTheGivenWindowSize =
-            matchesWithoutRedundantPairwiseMatches.size,
-          estimatedWindowSizeForOptimalMatch = updatedMatchesAndTheirSections
-            .estimateOptimalMatchSize(matchesWithoutRedundantPairwiseMatches)
-        )
-      end withMatches
-
-      // Cleans up the state when a putative all-sides match that would have
-      // been ambiguous on one side with another all-sides match is partially
-      // suppressed by a larger pairwise match. This situation results in a
-      // pairwise match that shares its sections on both sides with the other
-      // all-sides match; remove any such redundant pairwise matches.
-      private def withoutRedundantPairwiseMatchesIn(
-          matches: collection.Set[Match[Section[Element]]]
-      ): (MatchesAndTheirSections, collection.Set[Match[Section[Element]]]) =
-        val (redundantMatches, usefulMatches) =
-          val isAnAllSidesMatch: Match[Section[Element]] => Boolean = {
-            case _: Match.AllSides[Section[Element]] => true
-            case _                                   => false
-          }
+      // Eating into pairwise matches can create smaller pairwise matches that
+      // are partially subsumed by other larger pairwise matches. Prefer keeping
+      // the larger matches and remove the subsumed ones.
+      def cleanedUp: MatchesAndTheirSections =
+        val subsumedBaseSections = baseSectionsByPath.values
+          .flatMap(_.iterator)
+          .filter(subsumesBaseSection)
+        val subsumedLeftSections = leftSectionsByPath.values
+          .flatMap(_.iterator)
+          .filter(subsumesLeftSection)
+        val subsumedRightSections = rightSectionsByPath.values
+          .flatMap(_.iterator)
+          .filter(subsumesRightSection)

-          matches.partition {
-            case Match.BaseAndLeft(baseSection, leftSection) =>
-              sectionsAndTheirMatches
-                .get(baseSection)
-                .intersect(sectionsAndTheirMatches.get(leftSection))
-                .exists(isAnAllSidesMatch)
-            case Match.BaseAndRight(baseSection, rightSection) =>
-              sectionsAndTheirMatches
-                .get(baseSection)
-                .intersect(sectionsAndTheirMatches.get(rightSection))
-                .exists(isAnAllSidesMatch)
-            case Match.LeftAndRight(leftSection, rightSection) =>
-              sectionsAndTheirMatches
-                .get(leftSection)
-                .intersect(sectionsAndTheirMatches.get(rightSection))
-                .exists(isAnAllSidesMatch)
-            case _: Match.AllSides[Section[Element]] => false
-          }
-        end val
+        val matchesToRemove =
+          (subsumedBaseSections ++ subsumedLeftSections ++ subsumedRightSections)
+            .flatMap(sectionsAndTheirMatches.get)
+            .toSet

-        if redundantMatches.nonEmpty then
+        if matchesToRemove.nonEmpty then
           logger.debug(
-            s"Removing redundant pairwise matches:\n${pprintCustomised(redundantMatches)} as their sections also belong to all-sides matches."
+            s"Removing matches that have subsumed sections:\n${pprintCustomised(matchesToRemove)} as part of cleanup."
           )
         end if

-        withoutTheseMatches(redundantMatches) -> usefulMatches
-      end withoutRedundantPairwiseMatchesIn
-
-      // When the window size used to calculate matches is lower than the
-      // optimal match size, overlapping matches will be made that cover the
-      // elements of the optimal math. Estimate the size of the optimal match by
-      // coalescing the overlaps.
-      private def estimateOptimalMatchSize(
-          matches: collection.Set[Match[Section[Element]]]
-      ): Option[Int] =
-        // Deconstruct a throwaway instance of `MatchesAndTheirSections` made
-        // from just `matches` as a quick-and-dirty way of organising the
-        // matches' sections.
-        val MatchesAndTheirSections(
-          baseSectionsByPath,
-          leftSectionsByPath,
-          rightSectionsByPath,
-          _
-        ) = matches.foldLeft(empty)(_.withMatch(_))
-
-        val sectionsSeenOnAllPathsAcrossAllSides =
-          baseSectionsByPath.values ++ leftSectionsByPath.values ++ rightSectionsByPath.values
-
-        sectionsSeenOnAllPathsAcrossAllSides
-          .flatMap(maximumSizeOfCoalescedSections)
-          .maxOption
-      end estimateOptimalMatchSize
-
-      private def withMatch(
-          aMatch: Match[Section[Element]]
-      ): MatchesAndTheirSections =
-        aMatch match
-          case Match.AllSides(baseSection, leftSection, rightSection) =>
-            copy(
-              baseSectionsByPath = withBaseSection(baseSection),
-              leftSectionsByPath = withLeftSection(leftSection),
-              rightSectionsByPath = withRightSection(rightSection),
-              sectionsAndTheirMatches =
-                sectionsAndTheirMatches + (baseSection -> aMatch) + (leftSection -> aMatch) + (rightSection -> aMatch)
-            )
-          case Match.BaseAndLeft(baseSection, leftSection) =>
-            copy(
-              baseSectionsByPath = withBaseSection(baseSection),
-              leftSectionsByPath = withLeftSection(leftSection),
-              sectionsAndTheirMatches =
-                sectionsAndTheirMatches + (baseSection -> aMatch) + (leftSection -> aMatch)
-            )
-          case Match.BaseAndRight(baseSection, rightSection) =>
-            copy(
-              baseSectionsByPath = withBaseSection(baseSection),
-              rightSectionsByPath = withRightSection(rightSection),
-              sectionsAndTheirMatches =
-                sectionsAndTheirMatches + (baseSection -> aMatch) + (rightSection -> aMatch)
-            )
-          case Match.LeftAndRight(leftSection, rightSection) =>
-            copy(
-              leftSectionsByPath = withLeftSection(leftSection),
-              rightSectionsByPath = withRightSection(rightSection),
-              sectionsAndTheirMatches =
-                sectionsAndTheirMatches + (leftSection -> aMatch) + (rightSection -> aMatch)
-            )
-        end match
-      end withMatch
+        this.withoutTheseMatches(matchesToRemove)
+      end cleanedUp

-      // Eating into pairwise matches can create smaller pairwise matches that
+      private def // Eating into pairwise matches can create smaller pairwise matches that
       // are partially subsumed by other larger pairwise matches. Prefer keeping
       // the larger matches and remove the subsumed ones.
       def cleanedUp: MatchesAndTheirSections =
@@ -1651,7 +1447,11 @@ object CodeMotionAnalysis extends StrictLogging:
           )
         )
       end leftAndRightMatchOf
+<<<<<<< ourBranch
     end MatchesAndTheirSections
+=======
+    private def end MatchesAndTheirSections
+>>>>>>> problemMergeTheirSide

     given potentialMatchKeyOrder: Order[PotentialMatchKey] =
       given Order[Element] = elementOrder

Ironically, if the conflicted file is marked as resolved and a the diff shown above of the staged resolved versus the original is made, it is pretty straightforward to selectively revert the damage to get a good merge with the edits propagated through the code motion.

Some background that may be relevant - IntelliJ likes to permute the order of methods in large files on practically every single commit. It seems there is something in the method reordering that can't make up its mind quite what the perfect order is - so methods tend to move back and forth with each new commit. I'm not sure if they keep swapping places or are being permuted afresh each time.
So it is possible that on both branches, there are methods that have moved to different locations wrt the base version of the file. Those would be divergent moves, and they are most definitely not supported yet.
If that was the case, a diagnostic would have been nice...

IntelliJ's method sorting when applied to the sources of CodeMotionAnalysis is bonkers...
To simplify the exposition, let's break down the changes:

The method that was moved from the class MatchesAndTheirSection to the companion object on our side, being edited on their side - that is withAllMatchesOfAtLeastTheSureFireWindowSize.
Methods that were neither moved nor edited that act as anchors (at least from the point of view of IntelliJ doing a difff between versions). These are in order of appearance in the file: rightSection, matchForWindowSize, matchFrom and leftAndRightMatchOf.
Methods that weren't edited on either side, but were moved on both sides by in different ways by IntelliJ. To preserve sanity, let's just number them according to their order of appearance in the base side: 1 to 8.

In the base, we have:

`rightSection`
*`withAllMatchesOfAtLeastTheSureFireWindowSize`*
`matchForWindowSize`
`1`
`2`
`3`
`4`
`5`
`matchFrom`
...
`leftAndRightMatchOf`
`6`
`7`
`8`

The dotted sections are unchanged. The  and  were merged nicely.

On our side, we have:
PREFIX EDITED WITH MOVE DESTINATION OF withAllMatchesOfAtLeastTheSureFireWindowSize
rightSection
6
7
3
1
2
4
5
8
matchForWindowSize
matchFrom
...
leftAndRightMatchOf
EDITED SUFFIX

On their side:
PREFIX
rightSections
withAllMatchesOfAtLeastTheSureFireWindowSize - EDITED
6
7
8
3
matchesForWindowSize
matchFrom
...
leftAndRightMatchOf
1
2
4
5
SUFFIX
This time the method sorting grabbed all of 1 to 5 and 6 to 8, shuffled them into a different order than from our side and threw them back into the original two piles with no regard to their original pile.

It is fair to say that the method reordering seemed to be dependent on whether the Sun was in the Seventh House, using the collision of Jupiter and Mars as a tiebreaker.

Examination of the merge log reveals something odd from KineticMerge - it regards withAllMatchesOfAtLeastTheSureFireWindowSize as having stayed in place (albeit being edited). For that to happen, that would imply a whole lot of editing / movement of practically everything else around it, which does seem to be the case.

Based on the observation that withAllMatchesOfAtLeastTheSureFireWindowSize appeared to stay in place in the merge with other methods moving around it, tried an experiment where the ordering for CommonSubsequenceSize was modified to be: Ordering.by(size => size.elementSizeSumTiebreaker).
This means that the sum of the computed element sizes is the sole arbiter of how good a longest common subsequence is, rather than being a tiebreaker when two sequences have equal length.
Surprisingly, this didn't break any tests and resulted in the merge discussed by this ticket treating withAllMatchesOfAtLeastTheSureFireWindowSize is being a moved section, which seems intuitively more satisfying.
However, the small edits made in that moved methods were propagated as deletions, so the end result there wasn't quite as good. I wonder whether #29 would have sorted that out?
The rest of the file was as mangled as ever - so it seems that while the lack of motion of withAllMatchesOfAtLeastTheSureFireWindowSize was of interest, it is the diverging code motion elsewhere that is the real problem.
For now, the metric used by LongestCommonSubsequence will be left as it is, but this is worth reconsidering.

Further examination of the merge (without the experimental hack mentioned in the previous comment) showed three divergent moves of long sections through which deletions were propagated. These sections include 1 withMatches, 3 withoutTheseMatches and 4 estimateOptimalMatchSize as well as lot of subsequent methods , and seem to line up nicely with what was dropped from the resulting conflicted merge.
Other methods such as 6 withAllSmallFryMatches, 7 withPairwiseMatchesEatenInto and 8 cleanedUp were  moved without apparent divergence.
A conflict arose at the move source for 8 cleanedUp with the move destination of 4 estimateOptimalMatchSize. That needs reviewing; if 4 is moving off somewhere and 8 is moving in, then this isn't really a delete versus edit conflict, surely?
Looking more closely at the logs, the conflict in question was coalesced from two left-deletion versus right-edit conflicts and a following right insertion (of 8), so this probably one for ticket #28 when it lands.

So for now, we aren't supporting divergent moves yet. Nor are we handling the more complex propagation required by #28.
So apart from keeping the possibility of changing the metric for a longest common subsequence in mind, this is a wont-fix situation.
The moral of the story might be to disable this insane permutation of methods by (presumably) IntelliJ in the meantime.

Reopening after some contemplation.
This merge won’t ever be a clean one due to the divergent moves, but the outcome of the divergent moves was to have supposedly coincident deletions propagated to both move destinations for each of 1, 3 and 4.
This hides the divergent moves and leaves the user puzzled. Wouldn’t it be better to simply leave the two moves at their destinations?
The logic for propagating deletions (and edits, for that matter) is to pair a move with an obvious deletion (or edit) at the source of the move. If a section moves on both sides of the merge, then it really hasn’t been deleted (or edited) on any side - it is present on both our and their side.
This is exactly the line of reasoning for convergent moves, but is currently not used for divergent ones. Instead we have phantom deletions being propagated, or edits that are really just insertions at the move source.
While it won’t solve the problem of divergence, changing the handling of divergent moves might make the handling of these problem merges easier - if both moves are honoured, all the user has to do is delete one of them to get a clean merge. All the better if the divergence can be flagged with an informative message.
Let’s try this out and see how it works in practice…

Generating a diagnostic can wait for #38.
One thing that is a bit worrying - it's all very well when there are divergent moves as regarding each side's move destination as blocking any potential edit or deletion on the same side from the point of view of the other side. However, what should happen in the future of one move destination is selected?
If the move on the opposite side as the edit or deletion is selected, does that then convert into a propagation of the edit or deletion, because it is no longer being blocked by the dropped move destination?
This was the reasoning for allowing propagations through divergent moves as a way of hedging bets - the edit or deletion would be propagated through the move on the other side, but left in place on its own side just in case that side ended up dropping its move.
It depends on whether one things of dropping a move on one side as leaving it in its original base location on that side - in which case there should be no propagation even after one move destination is dropped.

The changes to MergeResultDetectingMotion went out in release 1.1.2, Git commit SHA: a46c47794b9fcc2532400d0e321749384a909921.

This went out in release 1.2.0, Git commit SHA: 4d1935beef2b5923417904895884de8c2e749c6e.


Please tag v1.2.0

Not just v1.2, for better compatibility with vendoring tools.

Can we rename the existing one? And what's the difference between v1.2 and v1.2.0 ?

Can we rename the existing one?

You can tag the same commit as v1.2.0. You should not rename or remove v1.2 as this will break things for some people.

And what's the difference between v1.2 and v1.2.0?

Strictly speaking, v1.2 is not a valid SemVer version.
Regular version scheme makes life easier for tools (vendoring, analytics ,etc.) authors and users.
Sorry if you think I'm too pedantic (you are probably right 😄).

Haha @AlekSi no :) I was just curios. Ok let me try to create a version. There is a new PR, once I've merge it I'll release a new version so no need to retag this one. Thanks!

We have a new tag now with v1.3.0. Thanks


Json definition in core.remote action command

SUMMARY
I need to insert a workflow parameter inside a Json definition for my action.
The first problem is that I can't even run the command with a Json definition in it (withou the parameter in the Json).
input:
  - parameter

tasks:
  run:
    action: core.remote
    input:
      cmd: command --json= '{"key1": "someValeu", "key": "secondValue" }'

This results in the error:
result:
  errors:
  - message: "mapping values are not allowed here
  in "<unicode string>", line 16, column 78:
     ... command --json= '{ "key1": "someValeu", "key2": "secondValue" }
                                  ^"

The second problem is, assuming I can resolve the first one, as far as I saw in the examples and tested,  <% ctx().parameter %> cannot be used inside single quotes, it only works when used inside double quotes. But the Json only works if I define it using single quotes. In the end I would like to have the workflow:
input:
  - parameter

tasks:
  run:
    action: core.remote
    input:
      cmd: command --json= '{"key1": "someValeu", "key2": <% ctx().parameter %> }'

STACKSTORM VERSION
st2 3.4dev (c422f0029), on Python 3.6.9
OS, environment, install method
Running on Kubenetes on k3os system. Deployed using stackstorm-ha
Expected Results
Is there a way to get around these problems?

 Then when it comes to the data-binary I am using '.
So this should mean I think for your first example you could use:
    input:
      cmd: "command --json= '{\"key1\": \"someValeu\", \"key\": \"secondValue\" }' "

I also confirmed that with the above example I could then also put in variables into the command, e.g.
'''
cmd: "curl -X POST -H 'Accept-Encoding: gzip, deflate' -H  'Accept: /' -H  'Connection: keep-alive' -H  'X-Auth-Token: token...' -H  'content-type: application/json' -H  'Content-Length: 137' --data-binary '{"action": "core.local", "cmd": "echo ponies<% ctx().key %>"}, "user": null}' http://<IP_ADDRESS>:9101/v1/executions"
'''
and it then replaced <% ctx().key %> with its variable (where key was in this case a parameter to the workflow).
Could you try using the above syntax with the " after the cmd:" and the extra escapes on the ", and see if that resolves your problem.

@amanda11 Using your syntax everything worked as I wanted. Thank you for the solution!


ng update from 7.3.7 to 8.0 throws custom rule error

Reproduction
When running ng update @angular/material, there are errors:
Could not find custom rule directory: ./attribute-selectors/
Angular was upgraded successful from 7.2.15 to 8.0.
My other simple project was upgraded successful (angular and material).
Error similar to 13913
Expected Behavior
Run migration without errors
Environment

Angular: 8.0
CDK/Material: 8.0
Operating System (e.g. Windows, macOS, Ubuntu):  Windows\macOS

@devversion Any chance you could take a look at this if @CRACKISH is able to provide additional information at your request?

@devversion Any chance you could take a look at this if @CRACKISH is able to provide additional information at your request?

I will provide any necessary information.

Trying to run material or cdk gives me this error
The command you asked in the closed thread seems to show the folder but there should be a issue with the path
ss/src on  feature/angular8 is 📦 v1.0.0 via ⬢ v12.4.0
➜  ls ./node_modules/@angular/cdk/schematics/ng-update/upgrade-rules
attribute-selectors             index.d.ts                      output-names                    signature-check
class-inheritance               index.js                        project-tsconfig-paths.d.ts     tslint-config.d.ts
class-names                     index.js.map                    project-tsconfig-paths.js       tslint-config.js
css-selectors                   input-names                     project-tsconfig-paths.js.map   tslint-config.js.map
element-selectors               misc-checks                     property-names

@devversion Any chance you could take a look at this if @CRACKISH is able to provide additional information at your request?

I'm also getting Could not find custom rule directory: ./attribute-selectors/ when running ng update @angular/material, I will provide any necessary information too if you need.

The problem stems from the node-glob-package. Both @angular\material\schematics\ng-update\index.js and<EMAIL_ADDRESS>call something like glob_1.sync('./**/', { cwd: __dirname, absolute: true }) which is expected to return an absolute path. But is doesn't. At least on Windows 10. It seems node-glob had some issues with absolute paths in the past. But currently there is no open issue.
As a workaround one could change absolute to the realpath option or add another option root: __dirname and adapt the glob-pattern accordingly.

Sorry about the slow response. I've been focused on migration work for Angular core and this didn't seem like a huge priority for now since version 8 of Angular Material has already been released.
Unless someone else is already putting in more investigation work, I'll try to take a look at it as soon as possible. Thanks!

@wildgarden I've submitted a PR that switches us away from node-glob, but I wasn't able to reproduce the windows issues on my machine. Can someone provide the version of glob in node_modules?
In any case it definitely looks like the path returned is not absolute according to the tslint failure message... so we should be good switching away from node-glob. Thanks!

Can someone provide the version of glob in node_modules?

I've run npm list glob in project's directory:
+--<EMAIL_ADDRESS>| +--<EMAIL_ADDRESS>| | +--<EMAIL_ADDRESS>| | | `--<EMAIL_ADDRESS>| | `--<EMAIL_ADDRESS>| |   `--<EMAIL_ADDRESS>| +--<EMAIL_ADDRESS>| +--<EMAIL_ADDRESS>| | `--<EMAIL_ADDRESS>| `--<EMAIL_ADDRESS>|   `--<EMAIL_ADDRESS>|     `--<EMAIL_ADDRESS>|       `--<EMAIL_ADDRESS>+--<EMAIL_ADDRESS>| +--<EMAIL_ADDRESS>| | `--<EMAIL_ADDRESS>| `--<EMAIL_ADDRESS>|   `--<EMAIL_ADDRESS>|     `--<EMAIL_ADDRESS>+--<EMAIL_ADDRESS>| +--<EMAIL_ADDRESS>| | `-- UNMET OPTIONAL DEPENDENCY<EMAIL_ADDRESS>| |   `-- UNMET OPTIONAL DEPENDENCY<EMAIL_ADDRESS>| |     `-- UNMET OPTIONAL DEPENDENCY<EMAIL_ADDRESS>| |       `-- UNMET OPTIONAL DEPENDENCY<EMAIL_ADDRESS>| `--<EMAIL_ADDRESS>|   `--<EMAIL_ADDRESS>+--<EMAIL_ADDRESS>| +--<EMAIL_ADDRESS>| `--<EMAIL_ADDRESS>|   `--<EMAIL_ADDRESS>+--<EMAIL_ADDRESS>| `--<EMAIL_ADDRESS>|   `--<EMAIL_ADDRESS>|     `--<EMAIL_ADDRESS>+--<EMAIL_ADDRESS>| `--<EMAIL_ADDRESS>+--<EMAIL_ADDRESS>| +--<EMAIL_ADDRESS>| `--<EMAIL_ADDRESS>|   +--<EMAIL_ADDRESS>|   | `--<EMAIL_ADDRESS>|   |   `--<EMAIL_ADDRESS>|   +--<EMAIL_ADDRESS>|   +--<EMAIL_ADDRESS>|   | `--<EMAIL_ADDRESS>|   +--<EMAIL_ADDRESS>|   | `--<EMAIL_ADDRESS>|   `--<EMAIL_ADDRESS>|     `--<EMAIL_ADDRESS>+--<EMAIL_ADDRESS>| +--<EMAIL_ADDRESS>| +--<EMAIL_ADDRESS>| | `--<EMAIL_ADDRESS>| `--<EMAIL_ADDRESS>|   +--<EMAIL_ADDRESS>|   | `--<EMAIL_ADDRESS>|   |   `--<EMAIL_ADDRESS>deduped
|   `--<EMAIL_ADDRESS>deduped
`--<EMAIL_ADDRESS>  `--<EMAIL_ADDRESS>

I updated successful. Can close issue. Thanks.

@CRACKISH Thanks for verifying that it's fixed! 💯 Also we just reworked our ng update implementation to no longer use TSLint.
Thanks all for actively providing information on this issue! 🥇


Add a flag to support the insertion of the 'use strict' directive

As title really, some projects enforce the use of the 'use strict' directive and it would be beneficial to have genversion support this in the output.
I have already made the changes and will submit a pull request.

Awesome! Thanks for the valuable addition. I will review the changes and the details you mentioned in PR as soon as I have time.

Excellent. Thanks very much.

Solved in v2.4.0


Update doc for secret management

What this PR does / why we need it:
This must be merged after #2097
Which issue(s) this PR fixes:
Fixes #
Does this PR introduce a user-facing change?:

NONE

/hold

/hold cancel

/changelog

/lgtm

Nice
/approve

/changelog


AOT Compilation makes other applications at server non-responsive

Hello
Within AOT compilation which takes 29 mins in my project server is almost dead in that period:

SMTP does not work,
MySQL is not responsive

So within AOT compilations other projects located on the same server affected.
Could you please add ability to limit CPU and memory usage within AOT compilation via WebPack
Thank you.

Throttling an application can be handled at the OS level, there are a variety of command line utilities that can be used to allow this depending on the OS.
Also, compiling and/or building is generally not something that should be done on the actual production server used to handle client requests.  Rather the project should be deployed to the production server after being fully built and staged.

Could you please suggest some throttling utilities?
As i didn't find any for Windows.


Implement "Active recently" (news_inbox)

Example:
GET https://i.instagram.com/api/v1/news/inbox/?mark_as_seen=false&timezone_offset=10800

Implemented "as is" in 1.7.6


⚠ Mobitopup has degraded performance

In 2641067, Mobitopup (https://napcard.voz.tech) experienced degraded performance:

HTTP code: 200
Response time: 6831 ms

Resolved: Mobitopup performance has improved in 30208d2.


build(todo): use node16 module resolution

Semi-automatic PR to switch to node16 module resolution

@jason-ha - In chat, we talked about the deprecated component model and agreed to remove the exports.
AB#7442 tracks detangling src/test builds.
Could you have another look?  Thanks.


Targets property

Is there any explanation of the "Targets" requirements?
"Targets": "<acl><ace identityName=\"c:0t.c|tenant|0d4b97fc-37fb-4db3-84f3-d34243a3afac\" displayName=\"0t.c|tenant|0d4b97fc-37fb-4db3-84f3-d34243a3afac\" sid=\"\" binaryIdType=\"1\" binaryId=\"YzowdC5jfHRlbmFudHwwZDRiOTdmYy0zN2ZiLTRkYjMtODRmMy1kMzQyNDNhM2FmYWM=\" allowRights=\"1\" denyRights=\"0\" /></acl>",

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

ID: 1b8beafb-a84e-534a-4553-ae25ca81c66c
Version Independent ID: b246e96e-0188-49d5-19c8-9e488a7e71ff
Content: GetById REST method
Content Source: docs/features/hub-site/REST-getbyid-method.md
Product: sharepoint
GitHub Login: @spdevdocs
Microsoft Alias: spdevdocs

The response type is specified as SPHubSite which explains Targets property.

Well I see that the 'Targets' property is a member of the SPHubSite type, but I guess my question boils down to .... Can the 'Targets' property be set via REST?
Copying the  generated when I added and cleared a group via PowerShell, and then trying to set it via REST did not work and I can't find any real mention of that particular property anywhere
Thanks!

ATM doesn't look at the REST API supports setting this property explicitly.


Interference between Quick Accent and Win+L to lock workstation

Microsoft PowerToys version
0.63.0
Installation method
PowerToys auto-update, Microsoft Store
Running as admin
Yes
Area(s) with issue?
Quick Accent
Steps to reproduce

Press Win + L to lock the desktop
Try pressing Space to trigger the password entry field (nothing will happen)
Press another key to get the password entry field
Type password and unlock desktop
The Quick Accent bar will be visible for the letter L
Only another press of the letter L will cause the Quick Accent bar to go away

(Quick Accent is erroneously noticing the key-down of the L from the Win + L combination, and not observing the key-up, probably because the locking of the desktop prevents it from propagating.  Quick Accent should not recognize the key-down in the presence of the Win-key modifier)
✔ Expected Behavior
Nothing (i.e. Quick Accent should not be triggered by the Win + L combination, and should not interfere with the lock screen)
❌ Actual Behavior
Quick Accent is triggered by the Win + L combination, and subsequently interferes with the lock screen recognizing the spacebar to begin unlocking the desktop.  (Fortunately it does not gobble space characters while typing the password to unlock.)
Other Software
Windows Desktop lock functionality

Sorry, this is a duplicate of #21036.


last connection time information

Hi , time shown in last connection time column , is in UTC time ? i'm asking because all connection shown -1 hours than mine
is it possible to show the correct time?

Yes it's in standard time, to change it automatically client-side is actually quite a heavy process, such as using moments.js or something but I can put it on my todo. You can also just change the timezone in the PHP, just add this function into config.php: https://www.php.net/manual/en/function.date-default-timezone-set.php

thank's , i'm not a php sw engineer but reading that page can i insert in the config.php a line like this before global $config;
date_default_timezone_set('Europe/Rome');
and automatically time will be adjusted?

Yes exactly, just paste it somewhere into config.php (anywhere beneath <?php).

ok it works


CoinDesk returns comma in price when over 1000USD

Just noticed this error when calling CoinDesk().get_current_price() as the price is now over 1,000 USD:
decimal.InvalidOperation: Invalid literal for Decimal: u'1,004.8813'
Wrapping coindesk.py line 14 in a str().replace() as such seems to resolve.
        price = data['bpi'][currency]['rate']

becomes
        price = str(data['bpi'][currency]['rate']).replace(',', '')

Might have to do on the rest of the price functions as well?
New to Python and GitHub in general so didn't actually fork and try to submit a PR.

#10 This should take care of it


Optionally use Node as containerSelector

I am using multiple instances of minigrid on elements with the same class, so I needed a way to scope the itemsNodeList QSA to children of a given container.
All I did was update L8 to:
var containerEle = containerSelector instanceof Node ? containerSelector : document.querySelector(containerSelector);

I can submit a PR if you'd like, or if you don't want it that's cool too :smiley:

@jodyheavener that's interesting. I like the idea to keep it as selector in the same way as querySelector works.
Any reason why don't you want to use ids i.e.
minigrid('#grid1','.grid-item');
minigrid('#grid2','.grid-item');

If you're using the version > v1.4.2  you can do that.
By the way, I'd love to see what you're building. I'm going to add a showcase section 😃
Cheers!

Hey Henrique!
No problem if we don't want to use it 😀
I've done it this way for two reasons:

Minigrid will be used on an arbitrary number of container elements, who don't have IDs (though I agree, it wouldn't be hard to add them)
I'm using Minigrid in a Backbone view, who's element I already have a variable for, so it's less expensive for me to pass in the Node instead doing another QSA

Thanks for the reply! I'll be sure to follow up when this project I'm working on is complete.

Hey @jodyheavener
It does make sense because I'm also using it in a React component. Can you submit a PR please? It's a small change with little impact and big win.
Looking forward for see this in action 😃

@jodyheavener can you also update the README too? 😃 leave the gh-pages for now because I'm working on it then I'll get the content from the README on master.
Cheers

Sure!
One thing: I am unable to run test/build. I installed browserify and testling but when I run npm run test I get:
><EMAIL_ADDRESS>build /repositories/minigrid
> npm run test && npm run uglify

><EMAIL_ADDRESS>test /repositories/minigrid
> browserify test.js | testling | tap-spec

sh: tap-spec: command not found
No headless browser found.

Any ideas?
Side not: I noticed browserfy is spelled incorrectly in CONTRIBUTING.md  ;)

@jodyheavener oh yes sorry you need install also tap-spec npm install tap-spec although I can see it on package.json. Thanks for that I'm going to fix it

My bad, didn't run npm install

Done! v1.6.0
Thanks @jodyheavener!

:smile_cat:


Receiving alarms must take precedence over receiving broadcasted messages

The GPBFT algorithm assumes that when an alarm is triggered it will get delivered at the designated time before a broadcasted message that so happens to arrive at the same time.
This assumption does not hold in the current simulations, where all messages including alarms use the same queue for delivery prioritised by deliverAt timestamp regardless of whether they are an alarm or broadcasted messages.

Respect the priority of alarms in simulation.
Document this requirement at gpbft.Clock.

https://github.com/filecoin-project/go-f3/issues/319
Given the above and async signing, this is not a property I can easily guarantee in a real system.

This spawned from #242, but that says the protocol...

assumes that when it sends a message, it is going to receive that message before it receives anything else

I.e. messages first, in the particular case of a send to self. So on the surface this strikes me as not the right fix.
It's also not documented in the code why the alarm-before-message assumption exists, and e.g. what would have to change for it to no longer be required (currently, it's just asserted with no justification). This should be documented somewhere in gpbft or the host API.
(The "why" for messages first is: so a send to self is received as if synchronously)

@Kubuxu noted in #318 that for message-over-alarm precedence

(The "why" for messages first is: so a send to self is received as if synchronously)

One can say the same about alarm. right?

I don't think there's any need for synchronous alarms. If code setting an alarm wants synchronous triggering, it should just call the trigger directly. Alarms are specifically to invoke asynchrony. The code (but not the FIP) uses "alarm at now" to invoke asynchrony with no delay just to unify the execution path into some bits of code, like starting a protocol instance.


[2.9.13] - SketchPicker - Regression

Hi ,
my base code is
            <SketchPicker color={this.state.value} onChange={(e: any) => {
                console.log(e)
                const hsl = e.hsl;
                const rgb = e.rgb;
                const value = this.state.value;
                let colorValueSend: string = "";
                if (/^#/gm.test(value) || extra!.colorMode! === "Hex") { colorValueSend = e.hex }
                if (/rgb/gm.test(value) || extra!.colorMode! === "Rgb") { colorValueSend = `rgb(${rgb.r}, ${rgb.g}, ${rgb.b})` }
                if (/hsl/gm.test(value) === true || extra!.colorMode! === "Hsl") { colorValueSend = `hsl(${hsl.h}, ${hsl.l * 100}%, ${hsl.s * 100}%)` }
                this.setState({ value: colorValueSend });
                handleValue(false, undefined, colorValueSend)
            }} />

PS: handleValue is custom  function on parent*
In the old version i have no issue about that;

It is really kinda weird so i will explain with picture
I expect to click on rgb(255,0,0) but got rgb(255,255,255).
and every selection is like that on "random" symetric values ... thats boring

Ok i Understand my value begin to "a" not by rgb/hsl/hex values ...
but really don't understand what happen next because if value is well fill by color it should give exact rgb values whatever next .... really weird behavior : /


Documentation: add tested OS in README and manual.

Transerve requirement: Since Linux OS has many variants and dependencies change with the version, the tutorial should mention the details regarding version and dependencies.

The manual states quite clearly that the recommended way of installing
the OCT is with Docker, in which case the Linux variant of the container
(the OCT) is fixed and the one of the host is almost irrelevant. I have
decided to establish the use of Docker back then because it allows us to
widely ignore the host system's specifics and to focus more on the
application itself (and also because it helped me in my effort to
transfer the tool from Titusz' computer to mine).
Nowadays Docker is a very well-known industry standard that we can
simply require. So let's not waste time on compiling a list of Linux
flavours and insist that Docker be used for installation. (A large
amount of tutorials on how to install and use Docker can be found on the
Internet.)

The manual states quite clearly that the recommended way of installing
the OCT is with Docker, in which case the Linux variant of the container
(the OCT) is fixed and the one of the host is almost irrelevant. I have
decided to establish the use of Docker back then because it allows us to
widely ignore the host system's specifics and to focus more on the
application itself (and also because it helped me in my effort to
transfer the tool from Titusz' computer to mine).
Nowadays Docker is a very well-known industry standard that we can
simply require. So let's not waste time on compiling a list of Linux
flavours and insist that Docker be used for installation. (A large
amount of tutorials on how to install and use Docker can be found on the
Internet.)

Maybe we should discuss whether we should ensure compatibility with Windows. In theory
it is possible to deploy the OCT with Docker on Windows, but in practice
there will be issues (I have observed this in the call I had with
Latacunga last year; it didn't work out of the box).

Maybe we should discuss whether we should ensure compatibility with Windows. In theory
it is possible to deploy the OCT with Docker on Windows, but in practice
there will be issues (I have observed this in the call I had with
Latacunga last year; it didn't work out of the box).


Develop the Header Component

Please refer to our Figma Hi-Fi page for the screenshots below for the different variations of the header.

Work in the file frontend/src/components/Header.tsx only.
Locate your images to use in the frontend/public/images. Please do not rename any image.
Visit the Landing at http://localhost:3000 to see your changes at the very top.
Raise a PR when done.

Dependencies

#13

Taking up this issue, and I will work on it.

Taking up this issue, and I will work on it.

@kerimcanbalkan Excited to have you take this one up.


VIP-CLI blocks user delete without reassign, but multisite doesn’t support the reassign parameter

From a client developer via DMs:

Trying to run example.develop:~$ wp user delete 123 --network --yes and I’m blocked with Error: wp user deletemust use a--reassign parameter to avoid accidental post deletion and including the reassign param doesn’t work on mu Error: Reassigning content to a different user is not supported on multisite.and including the reassign param doesn’t work on mu Error: Reassigning content to a different user is not supported on multisite.

The WP-CLI error message for ($network && $reassign) is in the WP-CLI source here:
https://github.com/wp-cli/entity-command/blob/master/src/User_Command.php#L269
Can we safely allow user deletion on multisite without the reassign parameter?

Nudging. I don't think we should be blocking with an error since this makes it impossible to run this across a network.
Core already has a confirmation prompt if the command is run without --reassign

The fix for this has been deployed and tested:
vip @<multisiteId> -- wp user delete dctest
--reassign parameter not passed. All associated posts will be deleted. Proceed? [y/n] y
Success: Removed user 38 from https://example.com.


MRG, MAINT: Reduce memory usage of examples

Closes #8241
The goal is to reduce memory usage -- we'll see what CircleCI reports here vs on master. But some relevant test timings locally on master:
45.42s total   mne/minimum_norm/tests/
37.23s total   mne/tests/test_source_space.py
21.81s total   mne/forward/tests/
 0.00s total   mne/forward/_make_forward.py

This PR:
47.28s total   mne/minimum_norm/tests/
37.83s total   mne/tests/test_source_space.py
20.52s total   mne/forward/tests/
 0.00s total   mne/forward/_make_forward.py

So it looks like removing the preload=True from the read_source_space code (which was causing memory usage jumps in the hundreds of MB range) seems to be okay

These are hopefully pretty straightforward memory reduction methods, let's see if things work in master.


go run fails on OS X

followed here and failed to run it on OS X 10.10.1
$ cd $GOPATH/src/github.com/hajimehoshi/ebiten/example
$ go run rotate/main.go
panic: reflect: slice index out of range

full log on gist
BTW gopherjs build just works :+1:

Thank you for reporting! It seems that github.com/go-gl/gl's version is old. If so, please try to go get -u github.com/go-gl/gl.

 Now it works as well. Thank you.

No problem :-)


[SPARK-41687][CONNECT] Deduplicate docstrings in pyspark.sql.connect.group

What changes were proposed in this pull request?
This PR proposes to deduplicate docstrings in pyspark.sql.connect.group.
Why are the changes needed?
For easier maintenance
Does this PR introduce any user-facing change?
No, dev-only. There're mintor doc changes that mention about remote support in Apache Spark 3.4.
How was this patch tested?
No test. It has to be manually verified until we resolve SPARK-41653.

Merged to master.


Is this compatible with  latest  release Home Assistant 2020.12? I have issue.

I Have following issue with  latest release 2020.12
My issue is described here, but the  remediation  there did not helped at all :-(
https://github.com/peterbuga/HASS-sonoff-ewelink/issues/261#issuecomment-744342379

in init.py delete
remove uuid from line ~26
so it's something like:
REQUIREMENTS        = ['websocket-client==0.54.0']
remove import uuid from line ~121
then change line 134 to anything like (has to be a valid uuid, eg):
self._imei          = str('12345278-1234-abcd-abcd-123456789011')

Same here. it seems not working on 2020.12.

It works after upgrading to 2020.12.1.

I can confirm. Same here. It works after upgrading to 2020.12.1.


LXD: Use consistent "member" terminology when using tx.GetNodes()

And fixes some user facing errors that mention "nodes" rather than "members".

Testsuite passed

jenkins: test this please


29 - Safari Action

Is there any way to instead of bringing up the menu to click on the elements, to open a Safari web view and have the JS communicate with that window? I have a little bookmarklet that works wonders with your code, but it overrides the parent window. I'd either like to launch the full iOS app to process the URL, or run the JS on that popover dialog in safari.
Is this possible?

@sammyd   :)

I'm not sure I understand quite what you're asking. I'm pretty sure that you couldn't launch the full app - you need to do the processing within the extension.

Right now I have this running perfectly fine, but I want to potentially do two things.
The window that comes down with the action list, I want to be a Webview instead, with a URL that's generated by the JS file.
I've gone away with the idea to launch the app instead.
Is this possible?


CDK please

Please replace the template.yaml by cdk stack.ts which are much more friendly to digest.
Why not using Amplify pub/sub instead of AWS IoT?
The workshop diagram show 2 API GW. Are there 1 or 2 API GW?

Hello - we have no plans to implement CDK at this stage, but I'll add to the backlog. This project does not use Amplify but you are welcome to use as an alternative. There are two API GW endpoints in use.


setup listeners for subscribed/unsubscribed events on 'on connect'.

This addresses #123.
I made the registration of listeners synchronous with the 'on connect' event handling. Also, whatever is dependent on the BLPAPI session within these listeners will wait for completion of the session creation.
Additionally, I refactored a bit some duplicated logic for unsubscription and subscription cleanup.

For the commit message, please see about closing issues: https://help.github.com/articles/closing-issues-via-commit-messages.
I recommend that we use Closes #<> as its own line at the end of the commit message.

Also, can we update the examples under examples/node/MarketDataSubscription_*.js?

Examples and code have been updated.

lgtm.  deferring to @ericlu88 or @yupinghu for final sign-off and merge.

Fixed example and squashed commits.

I updated the 'unsubscibe' function to reflect @ericlu88 feedback.

LGTM. Will merge once travis is happy.


[BUG] LossModule.convert_to_functional can NOT correctly deal with a Linear module in the PyG lib

Describe the bug
LossModule.convert_to_functional can NOT correctly deal with a Linear module in the PyG lib.
As some modules in PyG lib depend on the Linear module of the PyG version to work, if LossModule.convert_to_functional fails to work with it, it would cause severe incompatibility with the PyG lib.
To Reproduce
This example is mostly copied from the TorchRL's documentation, with only a substitution of torch.nn.Linear with torch_geometric.nn.dense.Linear.

Code
import torch
from torch import nn
from torch_geometric.nn.dense import Linear
from torchrl.data.tensor_specs import BoundedTensorSpec
from torchrl.modules.distributions.continuous import NormalParamWrapper, TanhNormal
from torchrl.modules.tensordict_module.actors import ProbabilisticActor, ValueOperator
from torchrl.modules.tensordict_module.common import SafeModule
from torchrl.objectives.ppo import PPOLoss
from tensordict.tensordict import TensorDict
n_act, n_obs = 4, 3
spec = BoundedTensorSpec(-torch.ones(n_act), torch.ones(n_act), (n_act,))
base_layer = Linear(n_obs, 5)
net = NormalParamWrapper(nn.Sequential(base_layer, Linear(5, 2 * n_act)))
module = SafeModule(net, in_keys=["observation"], out_keys=["loc", "scale"])
actor = ProbabilisticActor(
    module=module,
    distribution_class=TanhNormal,
    in_keys=["loc", "scale"],
    spec=spec)
module = nn.Sequential(base_layer, Linear(5, 1))
value = ValueOperator(
    module=module,
    in_keys=["observation"])
loss = PPOLoss(actor, value)
batch = [2, ]
action = spec.rand(batch)
data = TensorDict({"observation": torch.randn(*batch, n_obs),
        "action": action,
        "sample_log_prob": torch.randn_like(action[..., 1]),
        ("next", "done"): torch.zeros(*batch, 1, dtype=torch.bool),
        ("next", "terminated"): torch.zeros(*batch, 1, dtype=torch.bool),
        ("next", "reward"): torch.randn(*batch, 1),
        ("next", "observation"): torch.randn(*batch, n_obs),
    }, batch)
loss(data)

Traceback Info
Traceback (most recent call last):
  File "<project_root>/issuse.py", line 35, in <module>
    loss(data)
  File "<project_root>/venv/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1518, in _wrapped_call_impl
    return self._call_impl(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<project_root>/venv/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1568, in _call_impl
    result = forward_call(*args, **kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<project_root>/venv/lib/python3.11/site-packages/tensordict/_contextlib.py", line 126, in decorate_context
    return func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "<project_root>/venv/lib/python3.11/site-packages/tensordict/nn/common.py", line 282, in wrapper
    return func(_self, tensordict, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<project_root>/venv/lib/python3.11/site-packages/torchrl/objectives/ppo.py", line 433, in forward
    self.value_estimator(
  File "<project_root>/venv/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1518, in _wrapped_call_impl
    return self._call_impl(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<project_root>/venv/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1527, in _call_impl
    return forward_call(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<project_root>/venv/lib/python3.11/site-packages/torchrl/objectives/value/advantages.py", line 63, in new_func
    return fun(self, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<project_root>/venv/lib/python3.11/site-packages/torchrl/objectives/value/advantages.py", line 52, in new_fun
    return fun(self, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<project_root>/venv/lib/python3.11/site-packages/tensordict/nn/common.py", line 282, in wrapper
    return func(_self, tensordict, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<project_root>/venv/lib/python3.11/site-packages/torchrl/objectives/value/advantages.py", line 1224, in forward
    value, next_value = _call_value_nets(
                        ^^^^^^^^^^^^^^^^^
  File "<project_root>/venv/lib/python3.11/site-packages/torchrl/objectives/value/advantages.py", line 138, in _call_value_nets
    data_out = vmap(value_net, (0, 0))(data_in, params_stack)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<project_root>/venv/lib/python3.11/site-packages/torch/_functorch/apis.py", line 188, in wrapped
    return vmap_impl(func, in_dims, out_dims, randomness, chunk_size, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<project_root>/venv/lib/python3.11/site-packages/torch/_functorch/vmap.py", line 266, in vmap_impl
    return _flat_vmap(
           ^^^^^^^^^^^
  File "<project_root>/venv/lib/python3.11/site-packages/torch/_functorch/vmap.py", line 38, in fn
    return f(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^
  File "<project_root>/venv/lib/python3.11/site-packages/torch/_functorch/vmap.py", line 379, in _flat_vmap
    batched_outputs = func(*batched_inputs, **kwargs)
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<project_root>/venv/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1518, in _wrapped_call_impl
    return self._call_impl(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<project_root>/venv/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1527, in _call_impl
    return forward_call(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<project_root>/venv/lib/python3.11/site-packages/tensordict/nn/functional_modules.py", line 572, in new_fun
    old_params = _assign_params(
                 ^^^^^^^^^^^^^^^
  File "<project_root>/venv/lib/python3.11/site-packages/tensordict/nn/functional_modules.py", line 649, in _assign_params
    return _swap_state(module, params, make_stateless, return_old_tensordict)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<project_root>/venv/lib/python3.11/site-packages/tensordict/nn/functional_modules.py", line 389, in _swap_state
    _old_value = _swap_state(
                 ^^^^^^^^^^^^
  File "<project_root>/venv/lib/python3.11/site-packages/tensordict/nn/functional_modules.py", line 389, in _swap_state
    _old_value = _swap_state(
                 ^^^^^^^^^^^^
  File "<project_root>/venv/lib/python3.11/site-packages/tensordict/nn/functional_modules.py", line 378, in _swap_state
    raise Exception(f"{model}\nhas no stateless attribute.")
Exception: Linear(3, 5, bias=False)
has no stateless attribute.

Looking into the traceback, it's found that the state attribute _is_stateless is missing, which should be correctly copied in LossModule.convert_to_functional:
https://github.com/pytorch/rl/blob/bf264e0e24971fc05ec42b571de7b8df84043a51/torchrl/objectives/common.py#L247
However, Linear of the PyG version overrides the default deepcopy behavior:

This code is copied from PyG repo.

    def __deepcopy__(self, memo):
        out = Linear(self.in_channels, self.out_channels, self.bias
                     is not None, self.weight_initializer,
                     self.bias_initializer)
        if self.in_channels > 0:
            out.weight = copy.deepcopy(self.weight, memo)
        if self.bias is not None:
            out.bias = copy.deepcopy(self.bias, memo)
        return out

which will cause the extra attribute added to the module and not aware by the Linear module will be ignored.
Expected behavior
LossModule.convert_to_functional can correctly deal with a Linear module in the PyG lib, just as the standard Linear module in Pytorch.
System info

TorchRL 0.2.0
Torch 2.1.0
Python 3.11.6 | packaged by conda-forge
OS: WSL2 - Ubuntu 22.04 LTS

Checklist

[x] I have checked that there is no similar issue in the repo (required)
[x] I have read the documentation (required)
[x] I have provided a minimal working example to reproduce the bug (required)

I know this may be probably an issue caused by PyG side, as deepcopy is from python standard lib. But it would be better if some workaround can be made for modules that can not properly deepcopy, I guess?

I don't know if it's common to require modules to be deepcopied correctly along with external-added attributes.

Thanks for raising this.
We noticed the same thing with @matteobettini following #1576.
I think I can come up with a solution. This fits in a more general discussion about functional calls with tensordict and functional calls in general.
Context
We want to have modules that are parameter free (such that serializing them is cheap) and can be called with tensordict parameter as input. Long term the best thing will be to use torch.func.functional_call and I think we can make it work for v0.3.
Right now we use a trick from TensorDict where we patch the modules with a _is_functional and _is_stateless attributes, and call module(input, params). The forward method is wrapped in a function that scans the input for parameters and if found, places them within the module and executes it before taking them back.
Issues
This has several advantages. For instance, we can decorate any function in the module. However, it is a bit of a hack, and we want functional calls to be uniform within the PyTorch ecosystem. We're working on making TensorDict a possible input to functional_call, but that would require trnsordict to be integrated into core to be stable and reliable (without a ton of monkey patching). So until that happens we're stuck with our current method.
The functional call API was designed to take any TensorDict type as input. The decorated forward does these checks:

if a params kwarg is passed, we pop it from the kwargs and populate the module
if the module is stateless (=> check attribute) and the last input is a tensordict, we use it to repopulate the module. This is super clunky, as the last input could be something else (if you forgot to pass the tensordict) or the module could be stateful (and you'd still want to swap the old for the new params).

Solution (to this and other problems)
We have introduced a special parameter carrying container, TensorDictParams. What we could do is drop the private attributes in functional modules and just check the type of the last arg (if the params kwarg is not present). If found, we use it to repopulate. Only caveat is that I'm not sure of how to make this change in a non-bc-breaking manner (ie, still accept non TensorDictParams instances with a warning).
This will not completely solve your issue as the forward won't be declared anymore (because of how PyG deepcopy works). But we can patch __deepcopy__ during the functionalization too!
I will give it a shot next week and keep you posted.
Additional context
The move of trnsordict core features to PyTorch core is a proposal I want to make soon. I will ping you once I have an initial PR, any support or input would be appreciated!

@vmoens Thanks so much for your help with this issue. Looking forward to the solution and if there's anything I can do to help, just let me know.

I'm interested in a solution to this problem too!

i'll be working on this. The first step is to implement the to_module decorator in tensordict, but before that there are a couple of important PRs to merge. This will be part of 0.3, I promise!
https://github.com/pytorch/rl/discussions/1612#discussioncomment-7523027

I think #1707 and #1711 should solve this:
#1707 gets rid of the previous functional calls that relied on the clunky module(input, params=params) in favour of
with params.to_module(module):
    module(input)

I'm a bit puzzled about the fixes in #1711.
Here's the context:
we want the modules to be functionally called within the loss to allow for a bunch of things like ensemble learning (ie, a single forward pass for all q-value networks etc).
To do that we save the parameters on one side, and the module separately. We want to avoid for loss_module.parameters() to return a duplicated list of parameters. There are 2 solutions:

Save the module without nn.Module.__setattr__, directly in loss_module.__dict__:self.__dict__[module_name] = module

That avoids allocating the module in loss_module._modules which exposes it to parameters(), modules() etc. The problem I have with that is that we loose track of the module content, ie. if we call loss_module.cuda(2) hoping that the memory on cuda(0) is freed, we'll still have some parameters sitting there. We should then patch loss_module to have some wacky behaviour that does dispatching but not lookups, which isn't really doing us a favour.
Use deepcopy to store a copy of the module with parameters empty of any content. The idea is to use the "meta" device + functionalization to swap the module parameters with contentless parameters:def _make_meta_params(param):
    is_param = isinstance(param, nn.Parameter)

    pd = param.detach().to("meta")

    if is_param:
        pd = nn.Parameter(pd, requires_grad=False)
    return pd
with params.apply(_make_meta_params, device=torch.device("meta")).to_module(
    module
):
    # avoid buffers and params being exposed
    self.__dict__[module_name] = deepcopy(module)

We would still store it in self.__dict__ directly (because otherwise we'll have some contentless parameters in the parameter list)
Now I see that there is one main problem in this issue with deepcopy which is that we lose module attributes like _is_stateless but this isn't used anymore so that should work.
If anyone's interested in providing feedback, I'd love to hear concerns about using deepcopy is the only thing we do is (a) populate module with "meta"-parameters and (2) deepcopy such module within the loss module. Am I right to assume that if we don't have any weird patch of the module occurring like it used to be the case, this will work ok?

Thanks for this discussion.
One thing that I am not fully grasping yet is how solution 2 mititgates the issues of solution 1.
If we are still setting the modules with self.__dict__[module_name] = deepcopy(module), these will not be present in calls like modules().
That said, to me it seems like we should avoid solution 1 as I would not introduce wacky behaviors in losses to customly treat only some operations.
The use of deepcopy in general should be fine and solution 2 would solve the issues we have with PyG. Although I do not know if in general there are torch libraries that do not admit deepcopies.
I have some more general questions:

is with params.to_module(module); module(input) the same as torch.func.functional_call(module, params, input)?
I assume there is no way to store a module structure without params in pytorch and that is why we are populating it with meta params as place holders? It would be cool to have some more flexibility in separating modules from their params from torch core as this may also allow to avoid deepcopying just to have a functional version

One thing that I am not fully grasping yet is how solution 2 mititgates the issues of solution 1.

since the parameters have 0 content, we don't mind if calling loss_module.cuda() ignores them. Actually they must be ignored because if they were not calling param.to("meta").cuda() would fail (bc content has been erased).

is with params.to_module(module); module(input) the same as torch.func.functional_call(module, params, input)?

In this case yes but our solution allows you to call other methods than forward (like get_dist). We monkey-patch functional_call such that it does the same thing so the behaviour for forward is 100% identical, just slower.

I  assume there is no way to store a module structure without params in pytorch and that is why we are populating it with meta params as place holders?

We could use None but we would loose the "parameter" type I believe, which isn't great.

It would be cool to have some more flexibility in separating modules from their params from torch core as this may also allow to avoid deepcopying just to have a functional version

Not sure how you can do that without deepcopying? What would the API look like?
There is a way of having a stateless module, which is exactly what we do. But if you don't deepcopy it you simply lose the content, which I don't think is very wise in general.
If I was writing a code for myself, I would not deepcopy, I would simply do
params = TensorDict.from_module(module)
# make module stateless
params.to('meta').to_module(module)
# carry on with code

that way params and module are completely separated, but module still knows what is a param and what is a buffer (which I don't think is the case if you replace them with None)

params = TensorDict.from_module(module)
# make module stateless
params.to('meta').to_module(module)
# carry on with code

Right and we cannot do this because otherwise you would make the collection policy functional as well, thus the added deepcopy.
I think this all makes sense for me.

since the parameters have 0 content, we don't mind if calling loss_module.cuda() ignores them. Actually they must be ignored because if they were not calling param.to("meta").cuda() would fail (bc content has been erased).

Here I was referring to loss_module.modules() which will not list any module if i understand correctly

The goal is for them not to appear in modules() so that's not a bug, it's a feature :D


how do you install this since a dependency, sharp, has an install script, but I have ignore-scripts as a default for safety reasons

There must be a way to manually run sharp's install hook :thinking:

I came up with a hack / workaround here: https://github.com/lovell/sharp/issues/3351

Closing this as https://github.com/lovell/sharp/issues/3750 seems to have fixed that


Fixing forgotten details in submission failures reporting.

Codecov Report
All modified and coverable lines are covered by tests :white_check_mark:

Comparison is base (b7ac1f9) 69.68% compared to head (a555bfe) 69.69%.

:exclamation: Your organization needs to install the Codecov GitHub app to enable full functionality.
Additional details and impacted files
@@           Coverage Diff           @@
##           master     #458   +/-   ##
=======================================
  Coverage   69.68%   69.69%
=======================================
  Files         464      464
  Lines       17447    17446    -1
=======================================
+ Hits        12158    12159    +1
+ Misses       5289     5287    -2

:umbrella: View full report in Codecov by Sentry.
:loudspeaker: Have feedback on the report? Share it here.


chore(package): update ora to version 1.3.0

Codecov Report

Merging #116 into master will not change coverage.
The diff coverage is n/a.

@@           Coverage Diff           @@
##           master     #116   +/-   ##
=======================================
  Coverage   90.97%   90.97%
=======================================
  Files          16       16
  Lines         144      144
=======================================
  Hits          131      131
  Misses         13       13

Continue to review full report at Codecov.

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

Coverage remained the same at 90.972% when pulling 3a4d1adf1e83a34aef47ac9544049a586a61f25c on greenkeeper/ora-1.3.0 into 120689fedc50e69e2a7edc0e5b3de811c593f326 on master.


⚠ Bofrost.de has degraded performance

In c05db00, Bofrost.de (https://www.bofrost.de) experienced degraded performance:

HTTP code: 200
Response time: 1684 ms

Resolved: Bofrost.de performance has improved in 12170a4.


Tabs comoponent bug

Tabs component throws this error

Code:

onClick event on TabItem is probably causing problem, find out why.

From this question, we can conclude that the problem is in the name of the onItemClick function. We should try changing it to another name, e.g., handleItemClick. This function appears in the following files: TabItem.js and index.js (Tabs).
Also, this function is missing in PropTypes objects (data type and default value).


Expose meta content for filters

Problem
Currently, orga does not support variable graphql queries since only internal is exposed.
Details
For remark this is valid:
allMarkdownRemark(
      filter: { frontmatter: { category: { in: ["Pandas"] } } }
    ) {
      totalCount
      edges {
        node {
          frontmatter {
            title
            category
            date
          }
        }
      }
    }
}

However, the only option for filtering orga is allOrga (     filter: { internal: {content: { regex: "/CATEGORY:/"}}}    )
Since currently query CategoryPage($category: String) { (     filter: { internal: {content: { regex: "/CATEGORY:/" regex: $category }}}    ) also does not work.
Suggestion
If the meta object could be exposed to be similar to the remark frontmatter object, it would be greatly appreciated.

The gatsby-transformer-orga package received a pretty big overhaul. New features are added. Please head over to the doc page for details. That resolves your issue by putting all metadata into a meta property. I think you will like it. 😉

Thanks so much! Works perfectly now, will be transitioning to pure org mode and writing it up!!


Shadows point light

For #2594
I'll finish up https://github.com/AnalyticalGraphicsInc/cesium/pull/3691 first.
Some of the changes here will help with the terrain artifacts in that PR. v_normalEC wasn't getting to the receive-shadows shader correctly because terrain lighting is off by default. This caused back faces to not be shadowed. Now those varyings are outputted if the globe receives shadows. There are still some other artifacts to deal with though.
First I organized ShadowMap to handle point lights. It now uses the concept of passes - point light shadows have 6 passes, cascaded shadows have 4 passes, single shadow has one pass. Each pass has a PassState to set the viewport, and a camera. From scene's perspective it doesn't care what type of shadowing is done.
The point light shadow texture is basically a cube map that is flattened into a 2d texture. I'm a little worried about the amount of shader operations to convert from a cube-map direction to a 2d uv, but overall the benefits are that we can still use a depth texture, avoid binding different faces to the framebuffer for each pass, and overall cleaner integration with the existing code.

No OSX luck here either, but your screenshot looks awesome!

point light shadows have 6 passes, cascaded shadows have 4 passes, single shadow has one pass.

So, as of now, the cube map faces are not cascaded?  I am go with that to start as we discussed offline.  I expect that we will need it at some point though.

The point light shadow texture is basically a cube map that is flattened into a 2d texture.

Was this useful to you: http://webglinsights.github.io/downloads/WebGL-Insights-Chapter-16.pdf

In the future, we will also be interested in generating cube maps for relfection and refraction - and also rendering for picture-in-picture, multiple monitors, etc.
Is there anything you think we should do to the shadow map passes now in anticipation of this?  Or just rework when we actually need to?

I'm a little worried about the amount of shader operations to convert from a cube-map direction to a 2d...

I agree this is a lot of instructions, but they are all cheap.
How much did you look into optimizing this (most likely involves changing the layout as in Jeff's WebGL chapter)?  Could be a TODO for later...

That's all my comments.  Looks really cool.  Can't wait to run this.

How much did you look into optimizing this (most likely involves changing the layout as in Jeff's WebGL chapter)? Could be a TODO for later...

I tried to keep optimization in mind. There are two other direction-to-uv functions I found (that use branching), so I'll check those out. I may also just get it working with cube maps and see how it compares.
I took a look at the chapter, but since it's using octahedral projection it doesn't apply as well. I think the idea is the same though, and looks like one of those functions I found.

So, as of now, the cube map faces are not cascaded? I am go with that to start as we discussed offline. I expect that we will need it at some point though.

No they don't use cascades. The results seems pretty good though even with low resolutions.

Updated to fix the Chrome OSX problem.

OS X fix looks good.
Does this PR include everything in #3691?  Should we close that?
It doesn't need to be in this PR, but do you plan to add an option to load different test models in the Sandcastle demo and perhaps disable parts of the UI when they don't work (maybe that's overkill); right now, a lot of options don't apply to point lights?
Otherwise, this is all good with me.  @bagnell can you merge this (and #3691?) when you have reviewed.

Yes this includes all the comments in #3691, so it can be closed.
All those UI suggestions sound good to me. One thing I've wanted to fix for a while is rebuilding the terrain shaders when the shadow types change. Also fixing the models to turn shadowing on/off dynamically like primitives and terrain (using the derived commands from the 3d-tiles-styles branch).

#3691 Has a couple commits that aren't in this PR, so you could merge that branch into shadows or I can cherry-pick them here.

Cherry pick them here and close #3691.

Instead of enabling and disabling the UI, how about separate demos for each type of light source?

In the future, we will also be interested in generating cube maps for relfection and refraction - and also rendering for picture-in-picture, multiple monitors, etc.
Is there anything you think we should do to the shadow map passes now in anticipation of this? Or just rework when we actually need to?

I'm also interested in what you think about this. You may want to keep in mind that we will want to have multiple light sources. I see why we would have a shadow map dedicated to the Sun, but does czm_sunShadowMapTextureCube make sense?

Other that those two comments, I think this is good to go.

This is updated. While changing the point light uniform names I figured I should just change the others as well since the shadow map is not necessarily tied to the sun.

Updated to use immutable render states and to fix some issues with destroying the cube-map fbo's.


Feature / add possibility to use terragrunt

What would you like to be added:
add a possibility for easy use  terragrunt tool
Why is this needed:
we using actually terragrunt for our deployment in AWS and other cloud providers

Thank you for the issue.


issue #192: decouple visualisation from core explainability

This PR address #192 by moving viz methods from the explainers module to following files:

visualizations/visualization_results.py: abstract class for visualization methods
visualizations/factory.py: gets visualization according to explanation method/class
visualizations/shap.py
visualizations/lime.py
visualizations/pdp.py
visualizations/distance.py

changes made:

moved all viz methods to seperate module visualizations
updated tests to reflect change

changes made:

renamed visualizations/factory.py -> visualizations/__init__.py
refactored tests to reflect change


Truncate long messages Hipchat to avoid 400 error

For alerts with many sources in violation, error messages sometimes exceed the 10,000 character limit for Hipchat's send message API. This change truncates messages to Hipchat that would be over this limit.

LGTM


infer_storage_options lower-cases bucket names

Because dask.utils.infer_storage_options interprets a path as a generic URL, the bucket part of a path like "s3://mybucket/loc/mykey" becomes the host. Actual hosts are always lower-case, so the consequence is that only a lower-case version of the bucket name is kept. Thus, buckets with upper-case letters cannot be found.
@frol , do you have a moment to consider this?

I've also run into some trouble with infer_storage_options and Windows paths, which often start at C:\..., so that C: gets mistakenly read as a protocol.  I special cased it in infer_storage_options to solve the problem short term, but as you point out it's clear that the URL handling makes some inaccurate assumptions.  On the other hand the url handling is quite convenient for picking out username/password combinations and such.  I don't know what the right course of action is.


feature Make 'map_agg' support array type as value (#22945)

Proposed changes
pick #22945

Further comments
If this is a relatively large or complex change, kick off the discussion at<EMAIL_ADDRESS>by explaining why you chose the solution you did and what alternatives you considered, etc...

run buildall


Limit allowed values

In some cases, one might want to limit the allowed values of an input variable to some discrete list or range. If the input is not within the predefined range, an error is thrown. This would be an optional key in the input variables, e.g.
  'inputs': [
      {'name': "eta",      'type': "real", range: [-2.5,2.5] },
      {'name': "pt",       'type': "real" },
      {'name': "genmatch", 'type': "int", allow: [0,1,2,3,4,5,6] },
      {'name': "wp",       'type': "string", 'allow': ["Loose","Medium","Tight"]},
  ],

Of course in some cases you might capture these cases with overflow, underflow, or default values elsewhere down the line.

I think the nodes encode this information already: if a value is out of range or a key is not in the map then an error is thrown. Each node should probably get a flag to declare alternative handling of out-of-range, like clamp or default.

I think the nodes encode this information already: if a value is out of range or a key is not in the map then an error is thrown. Each node should probably get a flag to declare alternative handling of out-of-range, like clamp or default.

Hi @nsmith-, could we reopen this issue?
There's a use case in the TauPOG for limiting the values of string keys for systematic variations of the tau ID SF: We would like to decorrelate the statistical uncertainties between pt bins. To keep the file size down, we are using the default field in the category node to assign the nominal SF to systematic variation that do not affect a given pt bin. As it is now in schema v2, any misspelling of the systematic key by the user would not throw an error.
Implementing an optional field of allowed values in the Variable node (or perhaps in each Category) would like to protect against this at the top of evaluation.


processor set_input time stamp fix

Resolution of datetime.now() is in microseconds, so if input is set too fast it doesn't trigger process()
Added a 1us delay... but maybe there's a higher-resolution clock we could use instead?

Better fix implemented


Add an argument to the parent class to allow for numbers in the string.

This is useful when validating a username for randomness, as legitimate usernames can have numbers present. I need this additoinal functionality for validating usernames.

(sorry for the closing/reopening)

Hi Ryan, thanks for initiative!
Could you please create test and add usage example to README.md for your proposed functionality?


Error message being displayed

I am using teensy 4.0 (very similar connections like arduino) in place of arduino along with tdc7201 ZAX EVM board.
Initially I am aiming to produce start and stop pulse using the teensy itself to check whether or not the tdc7201 gives the correct time difference in between the two pulses generated by the mcu, i.e the very same thing which is performed in the example folder of yours.
 I am using the exact same code and the exact same pin config (as teensy and arduino pro mini have almost all the same pinouts). What could possibly be wrong due to which the time of flight is not being displayed and instead these error debug script are being displayed.
Thankyou for your assistance in advance.

@Pro140 could you use an external trigger instead?

@Pro140 The external trigger work for you? I want to know so that I can close this issue.

Hi.
I tried with external trigger but still the same.
I think the error was due to the fact that the mcu was not giving big enough pulse to cross the 2.31 V mark and thus was not getting recognised.
Currently I had to put the project on hold till other amplification parts arrive.
Thankyou for your response!!

Please let me know your findings.
Also add proper decoupling capacitor as the ASIC is very sensitive.
It's a pity that the first release of this library works and was tested with both internal and external tools. But after some comments from other users I modified it but with little to no test. So I want to avoid modifying it without confirming with an external trigger because internal triggers might be prone to noise.
Thanks in advance

Hi!
Just wanted to ask and make sure are there any changes in the code required if the start and stop signal are external(i.e not given from arduino/teensy itself)?
Also are there any changes in the physical connections, like any extra connection other than changing the start and stop wire?
Thank you in advance for your time!

The only changes would be to connect the external source to the pin that initially generates the trigger

I am still confused about where to connect the trigger?
Also, in the original code how is the trigger signal managed in the process as the tdc's trigger pin is not connected to any of the mcu pins.

For reference I found this on the net "The TRIGG pin generates an output when it is time to start a new measurement, but before the TRIGG pin is generated after you start a new measurement by writing a 1 to the CONFIG1 register. So technically you know when a measurement can be started. The signal that does need to be collected is the INTB pin which lets you know when a measurement has been completed. If you attempt to read the results register during a measurement this causes the measurement to be aborted."
I think that the problem I am facing could possibly be due to this trigger pin itself.
I am still facing the error mentioned at the start of this thread.
Your help would be immensely appreciated!


Fix profiler check

Description
After adding the waitall PR the nightlies started failing and was reported here : https://github.com/apache/incubator-mxnet/pull/14397#issuecomment-481821129
This was because waitall rethrowing exceptions that were hidden earlier.
Seems like operator-= for ProfileCounter is called during frees which checks if the amount to be freed is greater than alloced. Added a check before operator is called.
More permanent fix would be to understand why memory pool counters are incorrect when free is called but this PR should stop the profiler nightly test failures.
@ThomasDelteil
Checklist
Essentials
Please feel free to remove inapplicable items for your PR.

[ ] The PR title starts with [MXNET-$JIRA_ID], where $JIRA_ID refers to the relevant JIRA issue created (except PRs with tiny changes)
[ ] Changes are complete (i.e. I finished coding on this PR)
[ ] All changes have test coverage:
Unit tests are added for small changes to verify correctness (e.g. adding a new operator)
Nightly tests are added for complicated/long-running ones (e.g. changing distributed kvstore)
Build tests will be added for build configuration changes (e.g. adding a new build option with NCCL)
[ ] Code is well-documented:
For user-facing API changes, API doc string has been updated.
For new C++ functions in header files, their functionalities and arguments are documented.
For new examples, README.md is added to explain the what the example does, the source of the dataset, expected performance on test set and reference to the original paper if applicable
Check the API doc at http://mxnet-ci-doc.s3-accelerate.dualstack.amazonaws.com/PR-$PR_ID/$BUILD_ID/index.html
[ ] To the my best knowledge, examples are either not affected by this change, or have been fixed to be compatible with this change

Changes

[ ] Feature1, tests, (and when applicable, API doc)
[ ] Feature2, tests, (and when applicable, API doc)

Comments

If this change is a backward incompatible change, why must this change be made.
Interesting edge cases to note here

@yuxihu Good point I didnt investigate whether handle is getting double freed. I will check the same, though this PR doesn't have to block on it.

@yuxihu Good point I didnt investigate whether handle is getting double freed. I will check the same, though this PR doesn't have to block on it.

Yes, it is good to have the logic implemented in this PR anyway. The investigation can be done separately.


Fixes #2110 Invalid call to GetPythonToolsService in SurveyNewsService

Fixes #2110 Invalid call to GetPythonToolsService in SurveyNewsService
Ensures PythonToolsService is available and adds locking around event handling.

👍


Adds revision hash that was missing for OLM package

Improvements needed to Gopkg.lock that are needed to help go init mod do its job.

/lgtm
/approve

/retest

/retest


Address feedback from TAs

Feedback from milestone 1:

[x] The license should be copyrighted to your names not MDS.
[ ] Interesting question, don't need to go so far with 5 different models, keep things simple and clear.
[ ] The proposal should be in the README.md.
[ ] The download script should include a comment to explain what kind of exception you are expecting to catch.
[x] Why did you choose the figures you did?
[x] What is your interpretation of the preliminary analysis/ EDA?
[x] Do any predictors stand out as useful?
[x] Is there a class imbalance that needs to be taken into account?
[ ] Be sure to use git mv to move files so that the changes are tracked.

@SiqiTao hey Doris, could you address this feedback of the download script: "The download script should include a comment to explain what kind of exception you are expecting to catch." Thank you!

Questions to check with instructors/ TAs:

[ ] Do we need to render EDA report (example is a markdown document)?
[ ] What to do with proposal at this stage?

Additional improvement suggestions from Florencia during lab:

[ ] Code of conduct should include an email.
[ ] Figures should have captions.

could you address this feedback of the download script:

Yes!

@danfke will add a link to the proposal in the README.md.

@gn385x finished addressing all feedbacks for EDA. @iamMoid merged it.

Questions to check with instructors/ TAs:

[ ]  Do we need to render EDA report (example is a markdown document)?
[ ]  What to do with proposal at this stage?
[ ]  Are we expecting feedbacks for milestone 2 soon?

Pushing .ipynb to GitHub will render itself.
We will add proposal to README.md.
Feedback for milestone 2 will come next week.


[#517] Issues running RC check against R15 branch - Pipeline Trigger 4.15

Addresses # 517
Description
This PR adds a pipeline trigger to concatenate the execution of the 02.A. Deploy skill bots and 02.B. Run skill test scenarios pipelines in main and releases branches.
Detailed Changes

Updated the runTestScenarios yaml adding configuration for a pipeline trigger.
Updated the default value for the DEPLOYBOTRESOURCESGUID variable to match the current pipeline name.

Testing
These images show the 02.B pipeline successfully triggered after the 02.A finishes its execution, both in main and in one of the releases branches.

Promoted to MS in PR# 539