Add support for adaptive mesh refinement with hanging-nodes to Gridap.jl (serial runs)

Potential tasks (to be filled as we go):
CONCERNS

[ ] A remainder/concern to take into account while developing the code. Working with broken meshes like the ones in Step 0 below may lead to inconsistencies/violations of invariants inherent to Gridap's Geometry module.

One that immediately comes into my mind is that hanging faces are solely in one cell. IF the code uses this as a criterion to determine faces sitting on the boundary, we may end having hanging faces in the boundary of the domain. This is obviously not possible/inconsistent.
get_cell_permutations(...) may not provide the correct value for inter-octree owner (coarser) faces for non-oriented meshes.
do you anticipate any other inconsistency that may arise along these lines?

[ ] To think about how to implement facet integration on the boundary of cells with different levels of refinement and Neumann boundary faces. Does the approach based on broken meshes + glue versus meshes aware of non-conformity precludes us from implementing this? THINK NOW. [long-term] dev

TO-DO

[x] Immediate lines of action (2D code): (a) test with finer meshes/non-oriented meshes. (b) support for order>1 elements (currently only works for order=1 elements) (c) clean/abstract software.  26e34e130595f69f40a93cd9520be29ef811ac3f 0a290f3371e79f3202fc6a676d9368ea9cd92781 c5fe5a43c8658fade53bfe74fd8a027cdc6c8cbb 6d5fc79bee4a2718837220aa16a186411bda107e a099a54420671c8ac6a8cac3f6450b106cb09762 5debb9d91ff7a0a4b29fe5babe96a147522021cb e75910bca5d31f576c6e87779df9d51004236add
[x] To extend the program in https://github.com/gridap/GridapP4est.jl/issues/21#issuecomment-1384635611 for order>1 FEs. [short-term]
[x] To think how to extend to the nonconforming case the algorithms that generate the geometric entity IDs of vertices, edges, faces on the boundary of the adapted mesh from the ones of the coarsest mesh. See here for the case of conforming meshes. [short-term]
[x] To transform this TMP code such that it returns a fully consistent OctreeDistributedDiscreteModel. To this end, I expect we will have to to adapt/rewrite this function to the non-conforming case. In any case, it should be possible to re-use some of the building blocks, such as, generate_node_coordinates, but not all. [short-term]
[x] To extend this TMP code to 3D.  [mid-term]
[x] [ONLY IN 3d] To take into account https://github.com/gridap/GridapP4est.jl/issues/21#issuecomment-1386402744 while developing the code.  Related to previous task.  [mid-term] 8c6c278b80159a21e1114c6be699d9c4731b8ccc
[x] On a separate note, I do believe that the function generate_cell_vertices_and_faces should return dimension-indexed arrays (i.e., 1 for corners, 2 for edges, etc.), instead of separated arrays for vertices, and faces, etc. This would avoid code replication in the generation of symbolic constraint dependencies. cec3510e6349ef97b964e6e46b5b8fa036b67fc1

DONE

[x] @principejavier ... could you please help me out and extend the current P4est_wrapper.jl script so that we can start familiarizing ourselves with the logic behind p4est_lnodes_t in 3D? I think it might be a good idea to eairly stress/think deeply about the approach that we pursue to handle non-conforming meshes also in 3D, even if we defer the devs for 3D case for a later stage. Let me know what you think. [UPDATE by @amartinhuertas]: I added the P4est_wrapper.jl script that generates and shows the internals of p8est_lnodes_t. See: https://github.com/gridap/P4est_wrapper.jl/blob/adding_lnodes_example/test/example_lnodes_3d.jl and https://github.com/gridap/GridapP4est.jl/issues/21#issuecomment-1399232101

cc @santiagobadia @fverdugo
I create this issue as requested by @principejavier. The issue develops a bit further the project abstract available at
https://github.com/gridap/GSoC/blob/main/2022/ideas-list.md#add-support-for-adaptive-mesh-refinement-with-hanging-nodes-to-gridapjl
with additional remarks/code/details.

[Step 0].  A mano (no hace falta p4est), construir una malla con dos celdas, una refinada, y la otra no (un hanging node), construir un FE space non-conforming encima (el hanging node recibira un id de dof positivo), y luego construir el FESpaceWithLinearConstraints encima de este ultimo, y probar que todo ok para resolver un Problema de Poisson con solucion manufacturada con la maquinaria que tenemos ahora mismo en Gridap. Para construir la malla con las cinco celdas podemos utilizar, e.g., UnstructuredDiscreteModel. See, e.g., here for an example of manually building an UnstructuredDiscreteModel.

[Step 1] Familiarize yourself with the so-called p4est_lnodes_t struct. The subroutine that builds this struct in p4est provides degree=-2 option. I am positive this topological data structure is going to provide all the information that we need in order to glue vertices, edges, faces, etc. on the boundary of the cells in a parallel distributed context, find hanging vertices, edges, and faces, their coarser cells around, etc.  In other words, to be able to build the linear multipoint constraints which are required to fed FESpaceWithLinearConstraints. Note that in FEMPAR we used p4est_mesh_t instead of p4est_lnodes_t struct. Note also that in GridapP4est.jl I am already using p4est_lnodes_t to glue together vertices, edges, faces on the boundary of the cells in a distributed context. (See here). In order to help you out understanding this struct, I have written this P4est_wrapper.jl script that decodes the contents of the struct. Read the comments, and execute it to see the output on the terminal!!!

[Step 2] Combine the DoF numbering from UnconstrainedFESpace and the info extracted out of [Step 1] to automatically build the symbolic CSR part of the linear multipoint constraints. For the coefficients, you can use a similar strategy that the one in FEMPAR, i.e., basis functions evaluated in reference space at the vertices of a grid which represents the uniform refinement rule 1:2^d of the reference n-cube. To this end this piece of code can be useful as a starting point.

Thanks @amartinhuertas! I finally had time to start with this. So far I only completed Step0 and I got a fair first understanding of Gridap.Geometry. Everything seems to work, see the pictures without and with constrains:

Hi @principejavier ! Which is the status of this development?

Hi @amartinhuertas  I was at step 1 when shifted focus to other issues. I expect to have some time for this at the end of the month.

Ok. Thanks for the update. I may have some time the following two weeks to contribute to this dev. I am just asking so that we do not overlap work. My goal would be ideally to come up with the linear constraints built for the serial case + 2D, and be able to solve a 2D Poisson problem with a non-conforming mesh top-bottom.

cc @JordiManyer ... highly related to his current work.

I have time to put into this PR, although I don't really have experience with the low-level P4est api. But I'm glad to take any work off your hands if you need me to.

Here is the code for Step 0
module poisson

using FillArrays
using Gridap
using Gridap.Arrays
using Gridap.FESpaces
import Gridap: ∇

# Define manufactured functions
u(x) = x[1] # + x[2]
∇u(x) = VectorValue(1,1)
∇(::typeof(u)) = ∇u
f(x) = 0.0

function setup_model()
#
#  7---8---9------11
#  | 3 | 4 |       |
#  4---5---6   5   |
#  | 1 | 2 |       |
#  1---2---3------10
#
    ptr  = [ 1, 5, 9, 13, 17, 21 ]
    data = [ 1,2,4,5, 2,3,5,6, 4,5,7,8, 5,6,8,9, 3,10,9,11 ]
    cell_vertex_lids = Gridap.Arrays.Table(data,ptr)
    node_coordinates = Vector{Point{2,Float64}}(undef,11)
    for j in 1:3
        for i in 1:3
            node_coordinates[3*(j-1)+i]=Point{2,Float64}((i-1)/2.0,(j-1)/2.0)
        end
    end
    node_coordinates[10]=Point{2,Float64}(2.0,0.0)
    node_coordinates[11]=Point{2,Float64}(2.0,1.0)

    polytope=QUAD
    scalar_reffe=Gridap.ReferenceFEs.ReferenceFE(polytope,Gridap.ReferenceFEs.lagrangian,Float64,1)
    cell_types=collect(Fill(1,length(cell_vertex_lids)))
    cell_reffes=[scalar_reffe]
    grid = Gridap.Geometry.UnstructuredGrid(node_coordinates,
                                            cell_vertex_lids,
                                            cell_reffes,
                                            cell_types,
                                            Gridap.Geometry.NonOriented())
    Gridap.Geometry.UnstructuredDiscreteModel(grid)
end

function run()

# Construct the discrete model
model=setup_model()
labels = get_face_labeling(model)
labels.d_to_dface_to_entity[1]=[1,0,0,1,0,0,1,0,0,1,1]
labels.d_to_dface_to_entity[2]=[0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,1] # this is not needed...
add_tag!(labels,"dirichlet",[1])

# Construct the FEspace
order = 1
reffe = ReferenceFE(lagrangian,Float64,order)
V0 = TestFESpace(model,reffe,conformity=:H1,dirichlet_tags="dirichlet")
U = TrialFESpace(V0,u)

sDOF_to_dof = [4]
sDOF_to_dofs = Table([[2,6]])
sDOF_to_coeffs = Table([[0.5,0.5]])
Vc = FESpaceWithLinearConstraints(
  sDOF_to_dof,
  sDOF_to_dofs,
  sDOF_to_coeffs,
  V0)
Uc = TrialFESpace(Vc,u)

# Define integration mesh and quadrature
degree = 2
Ω = Triangulation(model)
dΩ = Measure(Ω,degree)

a(u,v) = ∫( ∇(v)⊙∇(u) )*dΩ
b(v) = ∫(v*f)*dΩ

# op = AffineFEOperator(a,b,U,V0)
op = AffineFEOperator(a,b,Uc,Vc)
uh = solve(op)

# Define exact solution and error
e = u - uh

# Compute errors
el2 = sqrt(sum( ∫( e*e )*dΩ ))
eh1 = sqrt(sum( ∫( e*e + ∇(e)⋅∇(e) )*dΩ ))

# tol=1e-8
# @assert el2 < tol
# @assert eh1 < tol

# Write the numerical solution, the manufactured solution, and the error
# in a vtu file
#writevtk(trian,"results",nref=1,cellfields=["uh"=>uh,"u"=>u,"e"=>e])
writevtk(Ω,"results",cellfields=["uh"=>uh,"u"=>u,"e"=>e])

end

end

For the records, and to help understanding the p4est_lnodes_t data structure, let me post below, assuming that we run the sample snippet program (in its current status: https://github.com/gridap/P4est_wrapper.jl/blob/a0b27a292f4684ccd485661b7ac05d9bccac2e32/test/example_lnodes.jl) in a single MPI task:

A picture of the element_nodes member variable, along with the values of other relevant member variables.
The output that the program generates on screen.

cell=1 faces=Int32[0, 1, 2, 3]
lface=0 gface=0
lface=1 gface=1
lface=2 gface=2
lface=3 gface=3
cell=1 vertices=Int32[4, 5, 6, 7]
cell=1 does not have hanging faces
cell=2 faces=Int32[1, 8, 9, 10]
lface=1 gface=1
lface=8 gface=8
lface=9 gface=9
lface=10 gface=10
cell=2 vertices=Int32[5, 11, 7, 16]
cell=2 has hanging faces
cell=2 lface=1 is NOT hanging
cell=2 lface=2 is hanging from half=0
cell=2 lface=3 is NOT hanging
cell=2 lface=4 is NOT hanging
cell=3 faces=Int32[12, 13, 3, 14]
lface=12 gface=12
lface=13 gface=13
lface=3 gface=3
lface=14 gface=14
cell=3 vertices=Int32[6, 7, 15, 16]
cell=3 has hanging faces
cell=3 lface=1 is NOT hanging
cell=3 lface=2 is NOT hanging
cell=3 lface=3 is NOT hanging
cell=3 lface=4 is hanging from half=0
cell=4 faces=Int32[13, 8, 10, 14]
lface=13 gface=13
lface=8 gface=8
lface=10 gface=10
lface=14 gface=14
cell=4 vertices=Int32[7, 11, 15, 16]
cell=4 has hanging faces
cell=4 lface=1 is NOT hanging
cell=4 lface=2 is hanging from half=1
cell=4 lface=3 is NOT hanging
cell=4 lface=4 is hanging from half=1
cell=5 faces=Int32[8, 17, 18, 19]
lface=8 gface=8
lface=17 gface=17
lface=18 gface=18
lface=19 gface=19
cell=5 vertices=Int32[11, 20, 16, 21]
cell=5 does not have hanging faces
cell=6 faces=Int32[22, 23, 14, 24]
lface=22 gface=22
lface=23 gface=23
lface=14 gface=14
lface=24 gface=24
cell=6 vertices=Int32[15, 16, 25, 26]
cell=6 does not have hanging faces
cell=7 faces=Int32[23, 27, 19, 28]
lface=23 gface=23
lface=27 gface=27
lface=19 gface=19
lface=28 gface=28
cell=7 vertices=Int32[16, 21, 26, 29]
cell=7 does not have hanging faces

The same as in https://github.com/gridap/GridapP4est.jl/issues/21#issuecomment-1384819749 but with an updated version of the test driver that just prints additional output on screen (https://github.com/gridap/P4est_wrapper.jl/blob/568fc013a991bde9f619886474cc35e5ae2f26ea/test/example_lnodes.jl) run on two MPI tasks:

[1,0]<stdout>:num_local_nodes=17
[1,0]<stdout>:owned_count=17
[1,0]<stdout>:num_nonlocal_nodes=0
[1,0]<stdout>:nonlocal_nodes=Int64[]
[1,0]<stdout>:global_owned_count=Int32[17, 13]
[1,0]<stdout>:global_offset=0
[1,0]<stdout>:num_nonlocal_nodes=0
[1,0]<stdout>:nonlocal_nodes=Int64[]
[1,0]<stdout>:cell=1 faces=Int32[0, 1, 2, 3]
[1,0]<stdout>:lface=0 gface=0
[1,0]<stdout>:lface=1 gface=1
[1,0]<stdout>:lface=2 gface=2
[1,0]<stdout>:lface=3 gface=3
[1,0]<stdout>:cell=1 vertices=Int32[4, 5, 6, 7]
[1,0]<stdout>:cell=1 does not have hanging faces
[1,0]<stdout>:cell=2 faces=Int32[1, 8, 9, 10]
[1,0]<stdout>:lface=1 gface=1
[1,0]<stdout>:lface=8 gface=8
[1,0]<stdout>:lface=9 gface=9
[1,0]<stdout>:lface=10 gface=10
[1,0]<stdout>:cell=2 vertices=Int32[5, 11, 7, 16]
[1,0]<stdout>:cell=2 has hanging faces
[1,0]<stdout>:cell=2 lface=1 is NOT hanging
[1,0]<stdout>:cell=2 lface=2 is hanging from half=0
[1,0]<stdout>:cell=2 lface=3 is NOT hanging
[1,0]<stdout>:cell=2 lface=4 is NOT hanging
[1,0]<stdout>:cell=3 faces=Int32[12, 13, 3, 14]
[1,0]<stdout>:lface=12 gface=12
[1,0]<stdout>:lface=13 gface=13
[1,0]<stdout>:lface=3 gface=3
[1,0]<stdout>:lface=14 gface=14
[1,0]<stdout>:cell=3 vertices=Int32[6, 7, 15, 16]
[1,0]<stdout>:cell=3 has hanging faces
[1,0]<stdout>:cell=3 lface=1 is NOT hanging
[1,0]<stdout>:cell=3 lface=2 is NOT hanging
[1,0]<stdout>:cell=3 lface=3 is NOT hanging
[1,0]<stdout>:cell=3 lface=4 is hanging from half=0
[1,0]<stdout>:cell=4 faces=Int32[13, 8, 10, 14]
[1,0]<stdout>:lface=13 gface=13
[1,0]<stdout>:lface=8 gface=8
[1,0]<stdout>:lface=10 gface=10
[1,0]<stdout>:lface=14 gface=14
[1,0]<stdout>:cell=4 vertices=Int32[7, 11, 15, 16]
[1,0]<stdout>:cell=4 has hanging faces
[1,0]<stdout>:cell=4 lface=1 is NOT hanging
[1,0]<stdout>:cell=4 lface=2 is hanging from half=1
[1,0]<stdout>:cell=4 lface=3 is NOT hanging
[1,0]<stdout>:cell=4 lface=4 is hanging from half=1

[1,1]<stdout>:num_local_nodes=18
[1,1]<stdout>:owned_count=13
[1,1]<stdout>:num_nonlocal_nodes=5
[1,1]<stdout>:nonlocal_nodes=[8, 11, 14, 15, 16]
[1,1]<stdout>:global_owned_count=Int32[17, 13]
[1,1]<stdout>:global_offset=17
[1,1]<stdout>:num_nonlocal_nodes=5
[1,1]<stdout>:nonlocal_nodes=[8, 11, 14, 15, 16]
[1,1]<stdout>:cell=1 faces=Int32[13, 0, 1, 2]
[1,1]<stdout>:lface=13 gface=30
[1,1]<stdout>:lface=0 gface=17
[1,1]<stdout>:lface=1 gface=18
[1,1]<stdout>:lface=2 gface=19
[1,1]<stdout>:cell=1 vertices=Int32[14, 3, 17, 4]
[1,1]<stdout>:cell=1 does not have hanging faces
[1,1]<stdout>:cell=2 faces=Int32[5, 6, 15, 7]
[1,1]<stdout>:lface=5 gface=22
[1,1]<stdout>:lface=6 gface=23
[1,1]<stdout>:lface=15 gface=32
[1,1]<stdout>:lface=7 gface=24
[1,1]<stdout>:cell=2 vertices=Int32[16, 17, 8, 9]
[1,1]<stdout>:cell=2 does not have hanging faces
[1,1]<stdout>:cell=3 faces=Int32[6, 10, 2, 11]
[1,1]<stdout>:lface=6 gface=23
[1,1]<stdout>:lface=10 gface=27
[1,1]<stdout>:lface=2 gface=19
[1,1]<stdout>:lface=11 gface=28
[1,1]<stdout>:cell=3 vertices=Int32[17, 4, 9, 12]
[1,1]<stdout>:cell=3 does not have hanging faces

Note that the p4est does not generate an ID for hanging nodes but it fills the cell with the constraining one (that is not already in the cell), e.g upper right corner of cell 3 in https://github.com/gridap/GridapP4est.jl/issues/21#issuecomment-1384819749 is printed as 16.
Therefore replacing the function setup_model in the code of  Step 0 above will not be immediate, we need to generate a new numbering (adding IDs to hanging nodes) to create the space V0. One option would be to just using a counter starting at num_local_nodes. In the parallel case it would require a reduction to generate global IDs.

Note that the p4est does not generate an ID for hanging nodes but it fills the cell with the constraining one (that is not already in the cell), e.g upper right corner of cell 3 in https://github.com/gridap/GridapP4est.jl/issues/21#issuecomment-1384819749 is printed as 16. Therefore replacing the function setup_model in the code of Step 0 above will not be immediate, we need to generate a new numbering (adding IDs to hanging nodes) to create the space V0.

Yes, I also noted that. Unfortunately, we cannot run the current algorithm for conforming meshes verbatim to generate the model produced by setup_model() in step 0 (e.g., for faces, this would imply gluing together the hanging faces and their owner face, which i think does not make much sense). As you say, it seems we need an ad-hoc numbering of vertices, edges, and faces algorithm for non-conforming meshes.
In 2D, the logic behind the definition of p4est_lnodes_t seems to be:

For hanging faces, it provides the "owner" face.
For hanging vertices, it provides the "opposite" (regular assuming 2:1 balance) vertex at the boundary of the owner face. As a result, p4est_lnodes_t does not "glue" together hanging vertices with the same global ID in all cells where the vertex belongs.

@principejavier ... could you please help me out and extend the current P4est_wrapper.jl script so that we can start familiarizing ourselves with the logic behind p4est_lnodes_t  in 3D? I think it might be a good idea to eairly stress/think deeply about the approach that we pursue to handle non-conforming meshes also in 3D, even if we defer the devs for 3D case for a later stage. Let me know what you think.

Just documenting in this post (to not forget) an scenario we will have to deal with correctly when working with 3D non-conforming meshes:

For the records, below you can find the output of https://github.com/gridap/P4est_wrapper.jl/blob/51530b6d8a88b2a6b14228eeffcd910b652a19a6/test/example_lnodes_3d.jl (i.e., p8est_lnodes_t for degree=-3) along of  an illustration that covers all possible cases:

cell=1 faces=Int32[0, 1, 2, 3, 4, 5]
lface=0 gface=0
lface=1 gface=1
lface=2 gface=2
lface=3 gface=3
lface=4 gface=4
lface=5 gface=5
cell=1 edges=Int32[6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17]
cell=1 corners=Int32[18, 19, 20, 21, 22, 23, 24, 25]
cell=1 does not have hanging faces
cell=2 faces=Int32[1, 26, 27, 28, 29, 30]
lface=1 gface=1
lface=26 gface=26
lface=27 gface=27
lface=28 gface=28
lface=29 gface=29
lface=30 gface=30
cell=2 edges=Int32[31, 32, 33, 34, 11, 35, 13, 36, 15, 37, 17, 38]
cell=2 corners=Int32[19, 39, 21, 40, 23, 41, 25, 42]
cell=2 has hanging faces
hanging_face=Int32[0, -1, -1, -1, -1, -1]
hanging_edge=Int32[-1, -1, -1, -1, 0, -1, 4, -1, 0, -1, 4, -1]
cell=3 faces=Int32[26, 43, 44, 45, 46, 47]
lface=26 gface=26
lface=43 gface=43
lface=44 gface=44
lface=45 gface=45
lface=46 gface=46
lface=47 gface=47
cell=3 edges=Int32[48, 49, 50, 51, 35, 52, 36, 53, 37, 54, 38, 55]
cell=3 corners=Int32[39, 56, 40, 57, 41, 58, 42, 59]
cell=3 does not have hanging faces
cell=4 faces=Int32[1, 60, 28, 61, 62, 63]
lface=1 gface=1
lface=60 gface=60
lface=28 gface=28
lface=61 gface=61
lface=62 gface=62
lface=63 gface=63
cell=4 edges=Int32[32, 64, 34, 89, 11, 65, 13, 66, 15, 38, 17, 72]
cell=4 corners=Int32[19, 40, 21, 73, 23, 42, 25, 91]
cell=4 has hanging faces
hanging_face=Int32[1, -1, -1, 0, -1, -1]
hanging_edge=Int32[-1, 0, -1, 4, 3, -1, 4, -1, 4, -1, 0, 4]
cell=5 faces=Int32[60, 67, 45, 61, 68, 69]
lface=60 gface=60
lface=67 gface=67
lface=45 gface=45
lface=61 gface=61
lface=68 gface=68
lface=69 gface=69
cell=5 edges=Int32[49, 64, 51, 89, 65, 70, 66, 71, 38, 55, 17, 72]
cell=5 corners=Int32[40, 57, 21, 73, 42, 59, 25, 91]
cell=5 has hanging faces
hanging_face=Int32[-1, -1, -1, 1, -1, -1]
hanging_edge=Int32[-1, 1, -1, 4, -1, -1, -1, -1, -1, -1, 4, 2]
cell=6 faces=Int32[1, 74, 75, 76, 30, 77]
lface=1 gface=1
lface=74 gface=74
lface=75 gface=75
lface=76 gface=76
lface=30 gface=30
lface=77 gface=77
cell=6 edges=Int32[33, 34, 78, 89, 11, 36, 13, 84, 15, 79, 17, 80]
cell=6 corners=Int32[19, 41, 21, 42, 23, 87, 25, 91]
cell=6 has hanging faces
hanging_face=Int32[2, -1, -1, -1, -1, 0]
hanging_edge=Int32[-1, -1, 0, 4, 4, -1, 0, 4, 3, -1, 4, -1]
cell=7 faces=Int32[74, 81, 82, 83, 47, 77]
lface=74 gface=74
lface=81 gface=81
lface=82 gface=82
lface=83 gface=83
lface=47 gface=47
lface=77 gface=77
cell=7 edges=Int32[50, 51, 78, 89, 36, 53, 13, 84, 79, 85, 80, 86]
cell=7 corners=Int32[41, 58, 42, 59, 23, 87, 25, 91]
cell=7 has hanging faces
hanging_face=Int32[-1, -1, -1, -1, -1, 1]
hanging_edge=Int32[-1, -1, 1, 4, -1, -1, 4, 2, -1, -1, -1, -1]
cell=8 faces=Int32[1, 88, 76, 61, 63, 77]
lface=1 gface=1
lface=88 gface=88
lface=76 gface=76
lface=61 gface=61
lface=63 gface=63
lface=77 gface=77
cell=8 edges=Int32[34, 64, 78, 89, 11, 66, 13, 84, 15, 80, 17, 72]
cell=8 corners=Int32[19, 42, 21, 73, 23, 87, 25, 91]
cell=8 has hanging faces
hanging_face=Int32[3, -1, -1, 2, -1, 2]
hanging_edge=Int32[-1, 4, 4, 2, 4, -1, 1, 4, 4, -1, 1, 4]
cell=9 faces=Int32[88, 90, 83, 61, 69, 77]
lface=88 gface=88
lface=90 gface=90
lface=83 gface=83
lface=61 gface=61
lface=69 gface=69
lface=77 gface=77
cell=9 edges=Int32[51, 64, 78, 89, 66, 71, 13, 84, 80, 86, 17, 72]
cell=9 corners=Int32[42, 59, 21, 73, 23, 87, 25, 91]
cell=9 has hanging faces
hanging_face=Int32[-1, -1, -1, 3, -1, 3]
hanging_edge=Int32[-1, 4, 4, 3, -1, -1, 4, 3, -1, -1, 4, 3]
cell=10 faces=Int32[92, 93, 3, 94, 95, 96]
lface=92 gface=92
lface=93 gface=93
lface=3 gface=3
lface=94 gface=94
lface=95 gface=95
lface=96 gface=96
cell=10 edges=Int32[7, 97, 9, 98, 99, 100, 101, 102, 16, 17, 103, 104]
cell=10 corners=Int32[20, 21, 105, 106, 24, 25, 107, 108]
cell=10 does not have hanging faces
cell=11 faces=Int32[93, 109, 61, 110, 111, 112]
lface=93 gface=93
lface=109 gface=109
lface=61 gface=61
lface=110 gface=110
lface=111 gface=111
lface=112 gface=112
cell=11 edges=Int32[64, 113, 89, 114, 100, 115, 102, 116, 17, 72, 104, 117]
cell=11 corners=Int32[21, 73, 106, 118, 25, 91, 108, 119]
cell=11 does not have hanging faces
cell=12 faces=Int32[120, 121, 122, 123, 5, 124]
lface=120 gface=120
lface=121 gface=121
lface=122 gface=122
lface=123 gface=123
lface=5 gface=5
lface=124 gface=124
cell=12 edges=Int32[8, 9, 125, 126, 12, 13, 127, 128, 129, 130, 131, 132]
cell=12 corners=Int32[22, 23, 24, 25, 133, 134, 135, 136]
cell=12 does not have hanging faces
cell=13 faces=Int32[121, 137, 138, 139, 77, 140]
lface=121 gface=121
lface=137 gface=137
lface=138 gface=138
lface=139 gface=139
lface=77 gface=77
lface=140 gface=140
cell=13 edges=Int32[78, 89, 141, 142, 13, 84, 128, 143, 130, 144, 132, 145]
cell=13 corners=Int32[23, 87, 25, 91, 134, 146, 136, 147]
cell=13 does not have hanging faces
cell=14 faces=Int32[148, 149, 123, 150, 96, 151]
lface=148 gface=148
lface=149 gface=149
lface=123 gface=123
lface=150 gface=150
lface=96 gface=96
lface=151 gface=151
cell=14 edges=Int32[9, 98, 126, 152, 101, 102, 153, 154, 131, 132, 155, 156]
cell=14 corners=Int32[24, 25, 107, 108, 135, 136, 157, 158]
cell=14 does not have hanging faces
cell=15 faces=Int32[149, 159, 139, 160, 112, 161]
lface=149 gface=149
lface=159 gface=159
lface=139 gface=139
lface=160 gface=160
lface=112 gface=112
lface=161 gface=161
cell=15 edges=Int32[89, 114, 142, 162, 102, 116, 154, 163, 132, 145, 156, 164]
cell=15 corners=Int32[25, 91, 108, 119, 136, 147, 158, 165]
cell=15 does not have hanging faces

@principejavier ... please note:

The following commit on GridapP4est.jl, p4est-migration-exploring-non-conformity branch. https://github.com/gridap/GridapP4est.jl/commit/7d7fc38eca3549fe46466a992a7e8499a8499734
I have updated  the issue description (https://github.com/gridap/GridapP4est.jl/issues/21#issue-1333404245) such that that I have added some additional tasks that I believe have to be completed after the work in 1.

I dont have much time the following weeks to continue with this dev (teaching starts). Can you please take the lead? We can have a meeting if you like, I can also help you out, but not too much time to write code.

After https://github.com/gridap/GridapP4est.jl/commit/e21df63f15b18e65d95141941161929ba23bb457 the code is working in 2D producing a DistributedDiscreteModel as in the uniform case, including geometric IDs. I need to change the focus (to produce some results with GridapMHD.jl) but I will continue with this development as much as I can.

After https://github.com/gridap/GridapP4est.jl/commit/e21df63f15b18e65d95141941161929ba23bb457 the code is working in 2D producing a DistributedDiscreteModel as in the uniform case, including geometric IDs. I need to change the focus (to produce some results with GridapMHD.jl) but I will continue with this development as much as I can.

FYI ... I could work on this the past couple of days. I have now to leave it here for this week. I moved part of the code to src and implemented the generation of symbolic constraints dependencies (the coefficient values are still missing).
On a separate note, I do believe that the function generate_cell_vertices_and_faces should return dimension-indexed arrays (i.e., 1 for corners, 2 for edges, etc.), instead of separated arrays for vertices, and faces, etc. This would avoid code replication in the generation of symbolic constraint dependencies.

@principejavier ... FYI, this week, I could work a day on this. I just pushed into the branch. The current code (https://github.com/gridap/GridapP4est.jl/blob/61b08ac74e8e560a762532ef8a1d896a02ca3d70/test/non_conforming_octrees_wip.jl) already automates the generation of constraints and reproduces https://github.com/gridap/GridapP4est.jl/issues/21#issuecomment-1384635611.
Thanks to @JordiManyer that helped us via this Gridap PR to provide some missing functionality needed to build the constraints (https://github.com/gridap/Gridap.jl/tree/refinement-rule-subface-glue).
Immediate lines of action:

test with finer meshes/non-oriented meshes.
support for order>1 elements (currently only works for order=1 elements)
clean/abstract software.

I am going to start next with the 3D case.

For the records, I have now a preliminary implementation of  3D AMR with forest-of-octrees that works for scalar Lagrangian FEs and arbitrary order. See https://github.com/gridap/GridapP4est.jl/blob/a65eb67e165e1489cef922dafa797bd29d196277/test/NonConformingOctreeDistributedDiscreteModelsTests.jl! Thanks to @JordiManyer that helped us to extending the functionality required to compute the constraints in 3D!

Closing this issue. At present, the code works in 2D/3D and in parallel with non-conforming meshes. all tasks except facet integration have been completed. See https://github.com/gridap/GridapP4est.jl/issues/35 for a more up-to-date list of pending tasks.


swagger-ui.js missing data-sw-translate

When I look at the file swagger-ui.js in the swagger repo it has the attribute data-sw-translate on the dom elements Model Schema but the output from swashbuckle doesn't Model Schema
i need the data-sw-translate attribute.

Available in v5.2.2


Add invoke command

Closes #883

We're missing some tests for providing a custom signer from using the CLI

I'd say it's out of scope of this PR. https://github.com/software-mansion/protostar/issues/879


Experimental CI Changes

This PR is used for testing the workflow file to isolate the GH Actions side effects.

Closing this as this PR was used to work on the CI pipeline, but only changes to the workflow file are required.


Can not change ActiveJob::Base.queue_adapter  in Rails 6 system spec

Rails 6.0.2 (or 6.0.1), rspec-rails 4.0.0.beta3, rspec-core 3.9.0.
I am used to being able to set ActiveJob::Base.queue_adapter to :inline in some tests and :test in others -- depending on nature of test, one or the other may be more convenient.
In particular in system tests (which I understand are now recommended by rspec-rails over the older rspec-specific feature tests), it is often convenient to use :inline, to get actual behavior.
However, under Rails 6, I am unable to set ActiveJob::Base.queue_adapter in a system test, it remains set to the Rails TestAdapter.
This spec would be expected to pass, but fails:
require 'rails_helper'

describe "Testing Jobs System Spec", type: :system do
  class MyJob < ApplicationJob
    queue_as :default

    def perform(*args)
    end
  end

  it "does something" do
    expect_any_instance_of(MyJob).to receive(:perform)

    ActiveJob::Base.queue_adapter = :inline
    #puts ActiveJob::Base.queue_adapter
    MyJob.perform_later("one")
  end
end

Above fails. However, it passes if you change to type: :model or type: :job (or probably any type but :system).
It is a regression in the sense that this identical test will also pass under Rails 5.2.3 , rspec-rails 5.0.0.beta3 (or rspec-rails 4.x), rspec-core 3.9.0.
It is confusing how rspec-rails relates to ordinary rails here. It's possible this is a bug/change in Rails itself, but i haven't yet figured out how to reproduce it for a report to Rails in a way that makes sense.
Either way, I believe this action (setting ActiveJob::Base.queue_adapter on a per-test basis, specifically in system tests) is something rspec users will want to do, and were able to do in Rails 5.x, but no seem to be in Rails 6.x. I believe it is a problem.
Some related context may be provided in: https://github.com/rails/rails/issues/37270  Although the original reporter there says their problem was resolved by Rails 6.0.2 -- however, the problem being reported here still reproduces in Rails 6.0.2.

My attempt to make a reproduction in straight Rails does not reproduce, it does appear to be a problem specific to rspec-rails.
This following Rails system test passes in Rails 6.0.2, demonstrating it is possible to change    ActiveJob::Base.queue_adapter in a Rails system test using standard rails testing.
require "application_system_test_case"

class JobsSystemsTest < ApplicationSystemTestCase
  class MyJob < ApplicationJob
    queue_as :default

    def perform(*args)
      $my_job_recieved_args << args
    end
  end

  setup do
    ActiveJob::Base.queue_adapter = :test
    $my_job_recieved_args ||= []
  end

  test "setting :inline adapter" do
    ActiveJob::Base.queue_adapter = :inline

    MyJob.perform_later("one")

    assert_includes $my_job_recieved_args, ["one"]
    assert_instance_of ActiveJob::QueueAdapters::InlineAdapter, ActiveJob::Base.queue_adapter
  end
end

It's definitely got something to do with ActiveJob::TestHelper.
I can't figure out what would have changed related to that in Rails 6. I can see how some of what's in there seems problematic, but it seemed problematic in Rails 5.2 also.  There is some discussion of related in rails/rails#37270 , but I don't fully understand the discussion there; there was apparently some change in Rails 6.0.2 intended to fix somewhat similar problems, but it does not fix above problem, which does reproduce in Rails 6.0.2 as well.
I can't quite figure out where ActiveJob::TestHelper gets included into the class in various versions. But to confirm it does, I check ActiveJob::Base.method(:queue_adapter).source_location, and see if it's ActiveJob::TestHelper or not.  It does seem to be included in Rails 5.2.x and 6.0.x, both rspec and Rails test case versions.
I can't figure out what would have changed to make behavior different with rspec and Rails 6 as above.
I've also been trying to figure out a workaround involving explicitly calling ActiveJob::TestHelper's enable_test_adapter, but haven't gotten that to work reliably yet -- although I can make it work in simple cases, I can't make it work in more realistic cases where I try to set adapter back to an original after test.

We don't tamper with this setting so its extremely odd if its something we're doing, it's more likely an interaction with ordering either of helpers or module inclusion et al, if you can find how they fixed it for minitest for 6.0.2 its likely that change can be applied here to help rspec-rails users.

Thanks for reply. I can't really figure out what's going on at all.
I understand it's not something you're doing, but it's still something that breaks with rspec-rails under Rails 6.0, and makes something useful/necessary to do no longer possible.  I suspect many people other than me are going to run into this.
Part of the confusion is that the way you do a number of things related to jobs and testing in Rails MiniTest seems pretty different than in rspec-rails. Combined with the fact that there is some weird old legacy code involved in ActiveJob::TestHelper.

, if you can find how they fixed it for minitest for 6.0.2 its likely that change can be applied here to help rspec-rails users.

So, I'm not sure the "it" is the same, I'm not sure they fixed "it" in minitest/rails. I know that rails/rails#37270  is related somehow, but I'm not certain it's the same issue reported.  I'm also not sure it's fixed, it is still open in Rails. This is all very confusing.  This is the PR mentioned in rails/rails#37270 as a fix... but I can't figure out why it wouldn't just apply to rspec-rails too, there's nothing obvious to me in there to port to rspec-rails.
If there was anyone else who had time to take a look, especially if they have some experience with this code, it would be very helpful. I'm pretty lost/blocked on it.

OK wait. That rails change makes Rails SystemTestCase "Inherit from ActiveSupport::TestCase instead of ActionDispatch::IntegrationTest"
Would that be a corresponding change needed in rspec-rails SystemExampleGroup?
It looks like it's still got:
https://github.com/rspec/rspec-rails/blob/7d68eb2306f3495d62618318e8839cf20f2a463d/lib/rspec/rails/example/system_example_group.rb#L10
And
https://github.com/rspec/rspec-rails/blob/7d68eb2306f3495d62618318e8839cf20f2a463d/lib/rspec/rails/example/system_example_group.rb#L74
Does one of or both of those need to be changed corresponding to https://github.com/rails/rails/pull/36283 ?
Figuring out how Rails test classes map to Rspec classes and setup is new to me, I'm not totally following all of this.

Okay, actually, just removing the line other.include ActionDispatch::IntegrationTest::Behavior  from https://github.com/rspec/rspec-rails/blob/7d68eb2306f3495d62618318e8839cf20f2a463d/lib/rspec/rails/example/system_example_group.rb#L74 makes my specs pass again.
That might corerspond to rails/rails#37270 SystemTestCase "Inherit from ActiveSupport::TestCase instead of ActionDispatch::IntegrationTest"?
Not sure if that's inconsistent with the include ActionDispatch::Integration::Runner  that's still there.
I can make a branch run all rspec-rails tests to see if any break with that.
I could use at least a sanity check from someone more familiar with this code and with rspec-rails SystemExampleGroup specifically. Looks like that's maybe @penelopezone and @jonrowe I'm kind of just twiddling bits here, I don't totally follow the principles behind rspec-rails adaptation of rails test classes.

OK, the specific rails commit that was a backport in rails to 6-0-stable branch, that probably needs to be done equivalently in rspec-rails is https://github.com/rails/rails/commit/ea77dbffdc81d6e40bbde155961ab57f1450d1e4
I am trying to prepare an rspec-rails PR, but not familiar with what's going on, having trouble figuring out what's going on in rspec-rails tests, like can't figure out how/if these specs ever get run. Continue to work on it, but definitely appreciate any tips or ideas, for what's going on in general.

Thanks for the detailed report @jrochkind. I will be happy to help you if I can in your PR.

Closed by https://github.com/rspec/rspec-rails/pull/2242

For anybody looking to fix their tests, also this can be used in all test types:
ActiveJob::Base.disable_test_adapter


Rules are ignored

I have a script for setting up windows across 3 displays. After upgrading Yabai I've experienced these rules being ignored a lot.
For instance I have this rule:
yabai -m rule --add app="^Slack$" space=7

And it's loaded into Yabai:
{
        "index":5,
        "label":"",
        "app":"^Slack$",
        "title":"",
        "role":"",
        "subrole":"",
        "display":1,
        "space":7,
        "follow_space":false,
        "opacity":0.0000,
        "manage":null,
        "sticky":null,
        "mouse_follows_focus":null,
        "sub-layer":"",
        "native-fullscreen":null,
        "grid":"0:0:0:0:0:0",
        "one-shot":false,
        "flags":"0x00000001"
}

And yet Slack is currently residing in space 5.
This is a general issue across a lot different applications, not specific to Slack.
Yabai version: yabai-v7.0.2
MacOS: 14.4 (23E214)
Not using the scripting-addition.

Resolved by running yabai -m rule --apply after configuring the rules. This wasn't necessary previously which had me confused. Sorry about the noise.


Late fee calculation should be a model method

Currently, we calculate the late fee for a given reservation in the relevant view (/reservations/:id) and in the relevant e-mail body; this logic should be in the model method and it should be dependent on whether or not the reservation is checked-in (e.g. either calculate estimate based on today's date if not checked in or calculate final fee).

Ha this was resolved in #1121 / #1197 by @squidgetx :smile:. Closing!


Host Pile pretokenized .bin and .idx megatron files?

It might be worth also hosting the Pile .bin and .idx files, for people to more easily reproduce our training runs on the same data if they desire. I don't think the deduplicated Pile has been hosted anywhere before.

It shouldn't be a huge issue if we don't host them, as the tokenization is deterministic.

I think we should do this, to make people’s lives easier. Yes the tokenization is deterministic, but it’s a pain to run locally. That’s especially true for people with fewer resources than us.

Yup, I think that makes the most sense. We could do it in its own file, or we could add it to the existing Pile file. I like the idea of the latter more, but it may be worth opening an issue to ask? We should definitely upload it to the EAI account as a standalone first though, to make it accessible as quickly as possible.

Makes sense! I tried uploading them standalone just yesterday to the hub but the upload (using the Python HF hub api) timed out because of the large filesize, so we may need to talk with HF on how to get a single large file hosted. (we could shard, but if possible would prefer to avoid potentially messing up the file)
the JSONLs are uploaded though, here: https://huggingface.co/datasets/EleutherAI/raw_deduplicated_pile I'll add some documentation soon.

@StellaAthena HF has a filesize cap of ~ 50GB but the .bin files are ~400GB for the deduped Pile and probably 1.5x that for the non-deduped Pile. is there any chance they'd make an exception, or do we need to host these elsewhere or shard the .bin file somehow? (not a huge fan of sharding it)

I think sharding it is fine, so long as we write a script that reconstructs the shards and test that it does so exactly. We can also provide a checksum so people can verify.


Adds user's org repos with admin permissions

Summary
Index now shows the repos for a specific organization for which the user has admin permissions.

Build :x:

Fixed build


Display selected regions as chips.

Description 📝
Highlight the Pull Request's context and intentions.
Changes  🔄
List any change relevant to the reviewer.

...
...

Preview 📷

How to test 🧪
Prerequisites
(How to setup test environment)

...
...

Reproduction steps
(How to reproduce the issue, if applicable)

...
...

Verification steps
(How to verify changes)

...
...

As an Author I have considered 🤔
Check all that apply

[ ] 👀 Doing a self review
[ ] ❔ Our contribution guidelines
[ ] 🤏 Splitting feature into small PRs
[ ] ➕ Adding a changeset
[ ] 🧪 Providing/Improving test coverage
[ ] 🔐 Removing all sensitive information from the code and PR description
[ ] 🚩 Using a feature flag to protect the release
[ ] 👣 Providing comprehensive reproduction steps
[ ] 📑 Providing or updating our documentation
[ ] 🕛 Scheduling a pair reviewing session
[ ] 📱 Providing mobile support
[ ] ♿  Providing accessibility support

Closing this PR and this is covered in #10375


Change bundle ID

To something like com.submarinerapp.Submariner
Will break sandbox paths until we do GH-65

I don't consider this one too important if I can get blessing to keep bundle ID the same.

From research and asking a friend, I don't think it matters - Apple doesn't seem to do anything with proving you own the bundle ID DNS-wise, and there's no real conflicting fork.


REGEX_LIKE and REGEX_MATCH don't support LargeUtf8 type

Describe the bug
While working on #12415, I found REGEX_LIKE and REGEX_MATCH don't support LargeUtf8 type.
To Reproduce
It can be reproduced by the following SQL
> select regexp_like(arrow_cast('abcdef', 'LargeUtf8'), 'bc');
Internal error: could not cast value to arrow_array::array::byte_array::GenericByteArray<arrow_array::types::GenericStringType<i64>>.
This was likely caused by a bug in DataFusion's code and we would welcome that you file an bug report in our issue tracker

> select regexp_match(arrow_cast('abcdef', 'LargeUtf8'), 'bc');
Internal error: could not cast value to arrow_array::array::byte_array::GenericByteArray<arrow_array::types::GenericStringType<i64>>.
This was likely caused by a bug in DataFusion's code and we would welcome that you file an bug report in our issue tracker

Expected behavior
They should work well like Utf8
> select regexp_like(arrow_cast('abcdef', 'Utf8'), 'bc');
+-----------------------------------------------------------------+
| regexp_like(arrow_cast(Utf8("abcdef"),Utf8("Utf8")),Utf8("bc")) |
+-----------------------------------------------------------------+
| true                                                            |
+-----------------------------------------------------------------+
1 row(s) fetched.
Elapsed 0.010 seconds.

> select regexp_match(arrow_cast('abcdef', 'Utf8'), 'bc');
+------------------------------------------------------------------+
| regexp_match(arrow_cast(Utf8("abcdef"),Utf8("Utf8")),Utf8("bc")) |
+------------------------------------------------------------------+
| [bc]                                                             |
+------------------------------------------------------------------+
1 row(s) fetched.
Elapsed 0.016 seconds.

Additional context
No response

The issue is not the first element in the array - it's the second. The code expects that the elements in the array are of the same type. For example, in the regexp_like fn:
let values = as_generic_string_array::<T>(&args[0])?;
let regex = as_generic_string_array::<T>(&args[1])?;

This should be a fairly simple fix with a few additions to the appropriate .slt file to prove the fix.

This would be a good first issue.

take


Removed access - always subscribed

Chrome Version 67.0.3396.87
Plugin Version 1.1.1
I was removed from a private repository so i don't have access to it. Now i can't unsubscribe me from the issues. But this issues are shown in the subscribed list.
I am not sure if you can do there anything.

Maybe ignore subscriptions from  repositories with no access.
Or add a unsubscribe button to the list?
Or add a filter option to see all or only this with access.

Thanks for reporting this issue!
Probably option 2 is the easiest one to implement.
Will work on it, and let you know once is pushed.

Hi
I added the ability to delete the subscription from the subscriptions page
Released in v1.2.1
Cheers!


ssm get_parameter to honot WithDecryption

This PR fixes a bug in release 1.1.13, namely that ssm.get_parameter() does not honor its WithDecryption parameter.
(Note that tox is reporting some errors elsewhere in the codebase--not in the change I just made--which seem to be environment related. I'm sorry that I haven't been able to get a clean tox build before submitting. Will continue to investigate that separately.)

Coverage remained the same at 93.591% when pulling e230407074f832da17ca04d7e4ba7dcb5d5f0a77 on RonRothman:fix-ssm-get-parameter into d69221992758e8fcced467c7b1c7cbd5f5a2d671 on spulec:master.

Ahh my bad, good spot :smile:

@RonRothman Thanks for this! Great catch. Welcome to Moto!

This is now released as Moto 1.1.14


Cannot fetch versions.json

A few issues here:

I am getting Error: Failed to fetch stable version info from raw.githubusercontent.com. Please try again later.. I am using denoland/setup-deno@v1.
Digging through the v1 branch, the error message is incorrect because the file being fetched is from https://deno.com/versions.json
At the moment, curl -I "https://deno.com/versions.json" takes a long time to complete so I suspect the fetch is timing out.

⟩ time curl --no-progress-meter -I "https://deno.com/versions.json"
HTTP/2 200
content-type: application/json
cross-origin-embedder-policy: same-origin
cross-origin-opener-policy: same-origin
cross-origin-resource-policy: same-origin
referrer-policy: strict-origin-when-cross-origin
strict-transport-security: max-age=63072000; includeSubDomains; preload
x-content-type-options: nosniff
x-frame-options: DENY
date: Tue, 22 Aug 2023 08:06:08 GMT
via: http/2 edgeproxy-h
server: deno/gcp-asia-northeast1

________________________________________________________
Executed in   10.22 secs      fish           external
   usr time   14.08 millis    8.86 millis    5.22 millis
   sys time   12.91 millis    4.65 millis    8.26 millis

Closing, found the status page...


test: add swift-test-depends target

check-llvm and check-clang have llvm-test-depends and
clang-test-depends targets which build all dependencies but doesn't run
the tests. Add similar target for check-swift. This allows me to easily
cross-compile the tests on a different system and then run on a matching
machine later.

Replace this paragraph with a description of your changes and rationale. Provide links to external references/discussions if appropriate.

Resolves SR-NNNN.

CC: @gottesmm @Rostepher

@swift-ci please test

CC: @llvm-beanz @chrisbieneman

LGTM.


Deprecate COD-Kotlin DSL combination

Fixes #13061

@bot-gradle test this

I've triggered the following builds for you:

PullRequestFeedback build

@bot-gradle test and merge

Your PR is queued. See the queue page for details.

I've triggered a build for you.


Add support for a persistent space whiteboard

We could explore a way for the Live Share Whiteboard extension to contribute a new “Whiteboard” node to the space tree, and back it’s content via a space property on the server.


vagrant: add note to the main readme to indicate caching is possible

The quickstart guide is nice and straightforward but I didn't intially
realize caching was possible. This change adds a note in the quickstart
to indicate to readers that caching is possible and that one should
refer to the vagrant directory readme for that information.
I was a tad bit iffy on where to put the note so I'm willing to move
it to later in the quickstart if we think it interrupts the flow
of the text.
Signed-off-by: John Mulligan<EMAIL_ADDRESS>

This change is

LGTM


Feature Request: un-complete a challenge

Issue Description
As a user I cannot unmark a challenge as complete.  This becomes problematic when a user might have accidentally marked something as complete or scope could have changed on an update.

This is not a direction Free Code Camp wants to go. Regardless of how the problem and tests may have changed we don't want to be encouraging students to "undo" progress. We want a student to use challenges purely as a way to prepare for the later project based learning rather than staying on the challenges and this mechanic would be at-odds with that goal. If a student genuinely needs to revisit a problem in order to better understand it or refresh knowledge I'd encourage them to do that, but they don't need to mark it incomplete in order to do it. Thanks and happy coding!

I think you might have misinterpreted my request.  Here's a great example.  I accidentally clicked the complete button on the tic-tac-toe project.  How can I got back and uncheck because I clearly have no supporting work.

It's not really a problem to have unfinished work submitted for projects because no one looks at them until you apply for the non-profit projects. If it really makes you uncomfortable you could always just make a placeholder codepen that just says "This isn't actually completed yet" or something, but I don't think you need to do that. I've submitted projects only to realize I missed a story or have a bug and I just go back and fix it, no big deal. This is definitely not a common enough use-case for us to make a whole feature around.

Jumping in because I accidentally marked a challenge as complete this morning when i haven't even started it. I accidentally linked a my wiki viewer to the random quote challenge and so it thinks I've completed it. I wish I could unmark the challenge because I think it looks dishonest. As a quick fix I'm going to create an empty pen with a message on it and link that to the challenge, but it's not ideal.

@DevGrrrl you could reapply link in that challenge again.  try that.


[Bug] Fix table upload progress refresh

fix initial delay
enable real progress bar during the upload

check #561 at same time as it touches table upload process too

part of https://github.com/syd711/vpin-studio/issues/561


adds two more presets

Adds two more presets and fixes qualitative capping to work with all adjustment modes.


Install failed: Error: Cannot find module<EMAIL_ADDRESS>

In raising this issue, I confirm the following:
{please fill the checkboxes, e.g: [X]}

[X] I have read and understood the contributors guide.
[X] The issue I am reporting can be replicated.
[X] The issue I am reporting can be is directly related to the pivpn installer script.
[X] The issue I am reporting isn't a duplicate (see FAQs, closed issues, and open issues).

Issue
This is a new Raspberry Pi 4 with Raspian installed via NOOBS.
It has been updated with "apt-get update" and "apt-get upgrade"
The installation of pivpn failed as described below.
Have you searched for similar issues and solutions?
yes
Console output of      curl -L install.pivpn.io | bash
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   178  100   178    0     0    246      0 --:--:-- --:--:-- --:--:--   246
100 58657  100 58657    0     0  68524      0 --:--:-- --:--:-- --:--:-- 68524
:::
::: You are root.
::: Verifying free disk space...
:::
::: Checking apt-get for upgraded packages.... done!
:::
::: Your system is up to date! Continuing with PiVPN installation...
Reading package lists... Done
Building dependency tree
Reading state information... Done
nodejs is already the newest version (10.15.2~dfsg-2+rpi1).
npm is already the newest version (5.8.0+ds6-4).
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
/usr/local/bin/bw -><EMAIL_ADDRESS>
><EMAIL_ADDRESS>postinstall /usr/local/lib/node_modules/@bitwarden/cli/node_modules/tldjs
> node ./bin/postinstall.js

internal/modules/cjs/loader.js:583
    throw err;
    ^

Error: Cannot find module<EMAIL_ADDRESS>    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:581:15)
    at Function.Module._load (internal/modules/cjs/loader.js:507:25)
    at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)
    at startup (internal/bootstrap/node.js:283:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:743:3)
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR<EMAIL_ADDRESS>postinstall: `node ./bin/postinstall.js`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the<EMAIL_ADDRESS>postinstall script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2019-09-02T10_26_20_301Z-debug.log

Console output of      pivpn add or pivpn add nopass
bash: pivpn: command not found

Console output of      pivpn debug
bash: pivpn: command not found

Have you taken any steps towards solving your issue?
Posting this message :-)

Try this workaround for now:
Manually download the script
wget https://raw.githubusercontent.com/pivpn/pivpn/master/auto_install/install.sh
Apply permissions
chmod +x install.sh
Remove this line from the file install.sh
https://github.com/pivpn/pivpn/blob/add3daf8deb6c949d54abb11ea2a992a48b865e3/auto_install/install.sh#L1376
Run the script
./install.sh

fix for this going to be pushed in about an hour or two.

@martin-ward Fix has been pushed, please try again and come back with feedback pls.

It got as far as installing Bitwarden:
::: Installing Bitwarden
/usr/local/bin/bw -><EMAIL_ADDRESS>
><EMAIL_ADDRESS>postinstall /usr/local/lib/node_modules/@bitwarden/cli/node_modules/tldjs
> node ./bin/postinstall.js

internal/modules/cjs/loader.js:583
    throw err;
    ^

Error: Cannot find module<EMAIL_ADDRESS>    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:581:15)
    at Function.Module._load (internal/modules/cjs/loader.js:507:25)
    at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)
    at startup (internal/bootstrap/node.js:283:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:743:3)
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR<EMAIL_ADDRESS>postinstall: `node ./bin/postinstall.js`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the<EMAIL_ADDRESS>postinstall script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2019-09-02T12_14_19_477Z-debug.log

hmm that one seems odd ...
Guess it will throw a lot of errors in the future depending on everyone's environment .. going to remove
Guess its safer Bit warden installation form the script completely, and leave the integration only with pivpn add  ... and users that want it installed should install it manually

well nevermind ... @orazioedoardo @martin-ward since i am part of this project i have tried to keep it as simple as possible and i have refused a bunch of PR's for less.
having this said ... I have removed bitwarden installation it from the installation script and no more issues should arise regarding this.
Integrating bitwarden install into this script its a cool feature, but should be kept to a minimum and by installing bitwarden with the install script i have deviated from what have been my principles since i joined this project.  for that my sincere apologies!
Bitwarden is still supported but only on pivpn add .. and it will bail out if doesn't find bw installed and warn users about it.
users that want bitwarden should install it themselves manually, as it turned out to be an extra painpoint which can cause a lot of errors depending on each user environment, and we have already enough of those issues around to worry about!
Thanks for all your patience,  help and support!

I skipped intstallation of bitwarden and the rest of the installation worked. The VPN seems to be working (tested on my Mac with Tunnelblick).

Great news! thanks a lot for your feedback!
once again my apologies for this buggy update! =(


sunodo init

📚 Context
If the user's system does not have the required packages and tools sunodo can't run in it.
✔ Solution
We could have an init sub-command to work along with doctor sub-command to check the dependencies required for sunodo, such as Docker and ... . When it does not exist or the version is too low, it can be installed automatically.
📈 Subtasks

[ ] init sub-command

🎯 Definition of Done

[ ] the sub command should run successfully and install each required tools based on the user's OS.

You mean install docker desktop?

The installation procedure of Docker Desktop for Mac from a command line application is quite frightening. Lots to go wrong there.
https://docs.docker.com/desktop/install/mac-install/

The installation procedure of Docker Desktop for Mac from a command line application is quite frightening. Lots to go wrong there.

your right. But we can start from other required tools.
Also, I think this is a good script example for docker desktop. (https://get.docker.com/)

Also, I think this is a good script example for docker desktop. (https://get.docker.com/)

This is for Docker Engine on Linux, not Docker Desktop, which is what we recommend.

Also, I think this is a good script example for docker desktop. (https://get.docker.com/)

This is for Docker Engine on Linux, not Docker Desktop, which is what we recommend.

It was just an example to show the idea.
if you think it's quite frightening. then init sub-command can skip the docker desktop installation and just prompt an instructions or refer to  links to install it.


Won't work on iOS 10.0.2

Hi, thank you for your work.
I'm trying to open links using your plugin but it won't work on iOS. Debugging it wouldn't show any error.
I installed the plugin, and I'm using your exact example, but it won't open anything on an iPad Pro with iOS 10.0.2.

Dunno, perhaps something whitelisting related? Google it for a bit..

Yes, sorry about not giving you more details. I'm already using the whitelist plugin and I do whitelist everything, all origin access just in case. And also I trace it with alerts all over and the function will fire without a problem, but it won't run anything. I've just updated to the latest version of iOS and I thought also it might be a problem with them, but I wasn't able to find anything related to it. I'll keep digging. Also, if I may, does this plugin work to open links like: http://www.maydomain.com/name_of_pdf.pdf ? Will it be shown in Safari?

I guess if it opens in regular Safari it will


Session scoped fixtures

Now that there is a global fixture module registry, it should be possible to implement session scoped fixtures.  We can store details about these in the registry and try to create them as close to the test start time as we can.  A few points:

I'm not sure how to determine the test start time.  We could probably do this as the first test setup we run into, but this might have some problems.  Async tests might also be running, and also some non-fixture using tests might have run beforehand.  Not sure if this is a problem, but things that will need to be thought about.
Session scoped fixtures may need to be defined in fixture modules rather than globally.   Though this probably depends on whether ExUnit compiles all tests before starting running tests or not.  Need to look into that.

Thinking about this some more: I might not need to precisely determine test start time.  It'd probably be OK to only create session scoped fixtures when we first encounter a test that depends on them.  We'd probably need a small amount of co-ordination/locking to ensure that 2 async test modules couldn't both create session fixtures at the same time, but that should be relatively trivial.
Presumably we'd need a way to tear down session scoped fixtures.  Not so sure how we'd do this, but can look into it.


Content tagging for single-sourcing

🚀 Feature
The idea of single-sourcing is to generate different outputs with one set of source files.
A typical example is for private and public docs, where the private docs are a superset of the public docs.
This is done by tagging content that can be included or excluded at build time.
Have you read the Contributing Guidelines on issues?
Yes
Motivation
Managing internal docs and public docs from one repo makes things a lot more easy, espcially when it comes to linking and information architecture.
Pitch
Flare, Sphinx and other docs-specific tools allow writers to tag content, very much like Docusaurus uses admonitions.
Sphinx example
non-tagged content

.. only:: my-admin-content-tag

   some tagged text

non-tagged content

And you can include this tag in the output with
sphinx-build -t my-admin-content-tag #this builds the admin docs

That's a great system to not limit the number of outputs.
Example with Docusaurus
Maybe 1 new admonition would do the trick as a first step, for instance, internal:
That's public text. It will be in the internal and public output.

:::internal
That bit is internal only and will not appear in the public output.
:::

Then we could build the internal docs with a flag:
yarn build --internal

Giving us:
That's public text. It will be in the internal and public output.

That bit is internal only and will not appear in the public output.

Would this be achievable?

@ArtFlag , we don't currently support this in core, but that may already be possible to build in userland

You can include/exclude docs from sidebars dynamically (see https://github.com/facebook/docusaurus/issues/3285#issuecomment-691982670) (not ideal because  it's per doc, and the doc would just be "hidden", still published without sidebar)

You can toggle a remark plugin for public deployments that would remove all content with ::: internal, similar to what admonition is doing except you remove the content instead of rendering an admonition

You can create a  <TagProtected tag="internal> component that you'd use in MDX This component can use site config  (like the customFields) to decide to render or not.

This is probably too opinionated to be officially supported, and it can be easily implemented in the userland. Closing in favor of #5701


feat: new CLI command to register templates in the base layer

Description

The validator node CLI now has two register subcommands: register validator and register template
New register template command (allows both command line arguments as well as interactive input) for template registration
Added JSON-RPC method (register_template) for template registration in the validator node. The existing validator node registration was renamed to register_validator_node

Motivation and Context
Up until now, to register templates in the base layer the only option was to craft a gRPC request to the wallet. This PR aims to provide an easy to use CLI command to avoid manually creating gRPC requests.
How Has This Been Tested?
Still not fully tested (draft status)

I think we should have the commands in the form resource subcommand e.g
vn_cli templates publish ...
vn_cli vn register
vn_cli mempool show

If you agree, I think we should have the commands in the form resource subcommand e.g vn_cli templates publish ... vn_cli vn register vn_cli mempool show

Sounds good to me, I will adapt this PR to this


devbox_vbox

Need to create this component.
The issues for devbox with docker are stacking up
https://github.com/radiasoft/container-sirepo-devbox/issues/7
https://github.com/radiasoft/rsconf/issues/353
https://github.com/radiasoft/rsconf/issues/300
https://github.com/radiasoft/rsconf/issues/258
https://github.com/radiasoft/rsconf/issues/249
https://github.com/radiasoft/rsconf/issues/240
https://github.com/radiasoft/rsconf/issues/237

Agreed.
Ben noticed that the sirepo/etc/run.sh script doesn't work in certain circumstances on devbox. For example, the script expects sudo to install deps. Another reason to make time to work on vbox so developers can have root access.
We could install the deps in devbox but I'd like to just get vbox working...


Update pre-provision-accounts.md

Bring this article inline with the notes section in https://docs.microsoft.com/en-us/powershell/module/sharepoint-online/request-spopersonalsite?view=sharepoint-ps

@JohanFreelancer9 Copy editing is needed for this PR. Thanks.

@kaarins PR has been copyedited and is ready for final review, could you please check and merge? Thanks!


Include operators in api generation

I noticed that operators are not currently included in the generated public api surface whereas I would expect operators to be included. This was the result of IsSpecialName returning true for operators.
Unfortunately there doesn't appear to be a good way to tell whether this is a "special name" that should be included or not (such as the case for operators). I confess I'm not sure what all falls under the "special name" category. The best differentiator I could find was sources claiming that all operator names are formatted as "op_*" so I leveraged that for determining if a given method is an operator. I'm very open to alternatives that can be more precise without needing to rely on string comparisons.
I'm willing to write more tests but I wasn't sure what would be overkill. I tried to mirror the Method_*.cs test files to a degree.

Awesome stuff. Made a few comments

I think it would be good enough to handle known operators except implicit casts as their code represention like your sample shows. Doesnt have to be fancy. We could always improve in a next major after releasing the first initial version (will also be a major)

@ryanwersal do you need help to get this going?

@danielmarbach Sorry, I admit I somewhat forgot about this... I'll look to getting it updated over the weekend.

No worries. Good stuff takes time 💃

Apologies for the near month (!!!) delay but I have the PR updated with a mapping as requested.
I did the operators I could find on the Overloadable Operators documentation except for the true/false operators as I found it a bit ambiguous in the final output (since it looks so similar to a boolean value/output).
Let me know if you'd like further modifications and/or add more tests. Thanks!

@ryanwersal scandalous :) :trollface:
Don't be so hard to yourself. You did awesome work here and every contribution is very much appreciated!
The packages are being indexed on nuget. In a few minutes your work is on the interwebs
Thanks again!


how to style an element with 'onOver' ?

I have an isolate scope directive that I want to add css style to when hovered over.
my directive:
listableresourcegroup(ng-repeat="group in app.currentrssgroupsselection()" grpid="{{ group.id }}" grpname="{{ group.name }}" grpstate="required" getresources="app.getgroupresources(grpid)" hasresources="app.grouphasresources(grpid)" showresources="app.showresources" addtogroup="app.addtogroup(group)" addstyle="app.addhoverstyle()" data-drag="true" jqyoui-draggable="{onStart:'app.setdndresource({rs:group})', onStop:'app.clearlimbo()'}" data-jqyoui-options="{revert: true}")
this is the template within my directive:
.panel-box-dnd.group(data-drop="true" jqyoui-droppable="{onOver: 'addstyle', onDrop: 'addtogroup({group:group})'}")
My onDrop function works great, and passes event,ui and my group object.
However, my onOver function is being called (I have a console.log that fires) but does not pass the event or ui objects. Why?
I planned to style the ui while onOver is called, but this causes a problem.
Is there a better way to style this object when hovered over ?

@sweather131: Can you share a demo to better understand the problem?

A little correction: you should to use data-jqyoui-options not jqyoui-droppable attribute. So something like data-jqyoui-options="{activeClass: 'under-drop'}"will work

@tirli: yeah, thanks..!

thanks @tirli and @codef0rmer . I will close this as I am no longer working on the issue.


DID IT

First pull request of my life, hope I didn't break the internet

🔌 checks the internet
looks like we're good 😄


Fix: Resolving a column from multiple tables could cause an UnknownColum...

...nException
if only one of the tables has the column

otherwise ack


Feature suggestion: Exporting vertex colours if no material is present

(As far as I see, GitHub doesn't seem to allow pull requests for specific commits. So I hope that it's okay that I'm simply creating issues for my commits, and linking to them to reference the changes. >_<)
This allows the user to export vertex colours when no material is present, as long as "force export vertex colors" is checked.
Commit reference: https://github.com/ArsThaumaturgis/YABEE/commit/9293f801c21e930dc178be62ec6ad055eef695c0

It occurs to me that it makes sense to link the relevant "pull request" here: https://github.com/ArsThaumaturgis/YABEE/pull/1
(Note that it was made in my own fork in order to isolate the changes. My apologies if there was a better way to do so, given that I had already made the commits when I came to do this! ^^;)


Add namespace to usage of ViewModelBase

fix for #17

@thomasclaudiushuber could you check this?

Hey @SeidChr, thanks for the Issue and the PR. I'll take a look at it within the next 24 hours. Sorry for the late reply here, I was off last week.

Thanks for the PR @SeidChr. It's merged and the new NuGet package with version 1.1.2 is available on NuGet


Added options for SQLite tracer and to lowercase the column names.

The --tracer option will now print out the SQL commands that the SQLite engine executes. This is helpful in trying to determine why some .mbox file cannot be loaded. For example, Google's Takeout produces .mbox files with email message header fields of mixed cases.
The --lowercol option will force the table column names to be lowercase.

I missed an erroneous print statement and added the --lowercol option to the readme.


曹雅琨——旅游辅助信息可视化

队员
曹雅琨
作品名称
旅游辅助信息可视化图
作品网址
网站网址：https://hlwtrip.mobirisesite.com/
其他说明
本地图以几个城市的民宿信息、疫情状况、机场情况为主，旨在能够为旅游出行提供相关辅助信息。

Hi Yakun, finally, you finished your works, and it is well done. Congratulations.

Hi Yakun, finally, you finished your works, and it is well done. Congratulations.

Thank Professor Wang for your affirmation and help in the process. And I wish you all the best.


iOS browsers not containing content in grid cell marked as overflow:auto

Hello,
I think I’ve found a bug in iOS browsers when rendering CSS Grid Layouts. So, I thought I would submit it here. I have created a CodePen to demonstrate the bug.
https://codepen.io/martinduo/pen/GvOWqX/
The Pen renders a 1-column, 1-row, single area grid that contains a single cell with 20 lines of text in a element flagged as overflow:auto.
Running the Pen in iOS v10.3.3 on the iPad using Safari renders the cell showing all 20 text lines, no scrolling is triggered. This is also the same error seen using Chrome v60.3112.19 or Firefox v8.2 on the iPad.
Running this Pen on OSX v10.11.6, using Firefox (not Safari or Chrome) renders the cell correctly showing only the first few text lines with scrolling enabled to see the other lines.
Running this Pen on Win10 v1703, or Android v7.1.2,  using Chrome, or Firefox renders the cell correctly showing only the first few text lines with scrolling enabled to see the other lines.
I have not found a workaround to fix this Pen code, but I did find a workaround in my full-blown project code in iPad portrait mode, with 3 rows in 1 column. There I could fix this by changing: “grid-template-rows: 1fr 54px 1fr;” to: “grid-template-rows: minmax(200px, 1fr) 54px  minmax(200px, 1fr);”.
Interestingly, when in iPad landscape mode, with a media query switch to 2 rows in 2 columns, the error never did show up in my project code.
Bruce Martin

I've been suffering from this same problem. It seems that Safari can't work out the height of the element if the height is something abstract like auto or an  fr amount. Setting it to a known height seems to be a work around.
https://codepen.io/anon/pen/YrpMgg
It seems that the known height can be something complicated like a calc() (in my case, I was able to use calc(100vh - 5em)).
It's far from ideal, but heights of auto or fr units seem to be the cause of the bug

It's far from ideal, but heights of auto or fr units seem to be the cause of the bug

I'd guess it's a failure to cope with indefinite sizes.

My work-around was to change the height specification from 1fr to minmax(200px,
1fr)
On Mon, Sep 25, 2017 at 7:22 AM, Geoffrey Sneddon<EMAIL_ADDRESS>wrote:

It's far from ideal, but heights of auto or fr units seem to be the cause
of the bug
I'd guess it's a failure to cope with indefinite
https://drafts.csswg.org/css-sizing-3/#indefinite sizes.
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub
https://github.com/rachelandrew/gridbugs/issues/12#issuecomment-331851858,
or mute the thread
https://github.com/notifications/unsubscribe-auth/AA1s7C_8QmfMNMhUzERLm-RtmMZdTgPIks5sl40LgaJpZM4O5Qr_
.


Traffic shifting docs

@lyft/network-team
fixes https://github.com/lyft/envoy/issues/194

Can you link this into the router architecture overview page, and also give that page a once over. I think there might be some stuff missing and/or out of date, and you could probably add some other links.


How to get the information of those key_points?

I want to do some math by the key_point to do something more than observe.Any good advice to get the information which I can use? TKU a lot!

Did you find the solution

Did any of you find out how to do this? i plan to use those information as well to perform auto annotation on new images after running through a trained model.


Idea of implementing hand tracking in DReyeVR

Hi,
did anyone consider implementing hand tracking in this program?
I am really interested in it and I am doing it right now.

Hi @sunchongren I think hand tracking would be a fantastic addition to DReyeVR!
Currently we have no plans on implementing it but there are plenty of reasons to include it, such as improving the user's sense of presence and increasing the number of potential interactions within the vehicle. While it is not our focus at the moment, we'd be happy to see what you come up with and integrate it with the rest of the codebase.
If you have any questions regarding the codebase, we'll be happy to help.


Update doc about responding to an interactive dialog submission

Address https://github.com/mattermost/mattermost-developer-documentation/issues/250

@hanzei Updated per suggestions.


Make zip function available in Jinja

Would like to use zip to loop over some results in a Jinja template
{% for j,k in zip(a, b) %

Currently zip is not available, but would make my code a much cleaner.

Thanks for opening this issue @friendofasquid!
I can buy either:

Adding zip to the context directly, or
Adding it under a namespace

I think if we're only going to add zip, then adding it to the context directly makes sense. If we're instead going to add other Python builtin functions in the future (like set(), dict(), tuple(), or similar) then we'd be better off namespacing the functions to avoid polluting the global namespace.
I think I'd be in favor of adding set at the very least -- maybe we would also benefit from:

all()
any()

As far as namespaces go, we already have a builtins namespace, so we could probably add builtins.zip with a single line of code :D
Do you have any thoughts / preferences / ideas? Curious to hear what you think

I don’t know enough about Jinja templating to comment.
My gut would be to have a set of things that aren’t namespaces, mostly because I think dbt is a lot of people’s first time writing code that isn’t SQL.

@drewbanin bumping this back up to see if this can be done

I buy the utility of this one, especially zip() + set(). There have been a handful of times I'd wanted to use set logic in particular (example).
I also think the initial reservation may not be as much of an issue, given how we construct builtins: Every method decorated @contextmember gets added to both the global namespace and the builtins namespace. If ever a user wanted to customize the set() macro, they could do it by writing a macro named set() that references builtins.set(). That's (my understanding of) how overrides for ref, source, config work today, and : https://docs.getdbt.com/reference/dbt-jinja-functions/builtins.
The code here can be a little bit tricky, but the basic implementation should look a lot like the tojson method:

Decorated with @staticmethod + @contextmember
Perform the Python operation (zip(), set(), etc) and return the value
Tested in test/unit/test_context.py

I'm going to open this one back up, and mark it as help_wanted (a.k.a. "good second issue," for a community contributor who's comfortable writing a bit of Python)


Update Pages “HowOftenSHouldYouDoaTermiteInspectionPage”

Automatically generated by Netlify CMS

👷 Deploy Preview for chic-shortbread-66a66b processing.

Name
Link

🔨 Latest commit
035a59b2ed67d94b2b172e0c706862adae6cc57c

🔍 Latest deploy log
https://app.netlify.com/sites/chic-shortbread-66a66b/deploys/6567c1418e84190008403bb8


Add a specialized unhandled conflicts close handler

This is set dynamically whenever unhandled conflicts are detected. It unsets itself when merging is done so that the normal save-close-handler comes to place
https://github.com/microsoft/vscode/issues/152841

fyi @bpasero

For reference, Git shows this when you discard:

@bpasero  https://github.com/microsoft/vscode/pull/155176 is out to tweak the message to save "Save & Continue..." when any input is dirty. Unsure about the discard tweaks - I am not keen on showing a modal after a modal. We either find something better than "Discard Merge Changes" or tweak the message "Do you want to continue with unhandled conflicts?"