From 9866519491007d5a8a51a0818061944b2a6c1b72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojciech=20Jab=C5=82o=C5=84ski?= Date: Fri, 21 Sep 2018 12:32:09 +0200 Subject: [PATCH 01/12] added AST diff MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Wojciech Jabłoński --- uast/diff/changelist.go | 58 ++++++++ uast/diff/diff.go | 283 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 341 insertions(+) create mode 100644 uast/diff/changelist.go create mode 100644 uast/diff/diff.go diff --git a/uast/diff/changelist.go b/uast/diff/changelist.go new file mode 100644 index 00000000..6a75be26 --- /dev/null +++ b/uast/diff/changelist.go @@ -0,0 +1,58 @@ +package diff + +import ( + "gopkg.in/bblfsh/sdk.v2/uast/nodes" +) + +type Changelist []Change + +type Change interface { + isChange() +} + +type changeBase struct { + txID uint64 +} + +func (_ *changeBase) isChange() {} + +// TODO: proper ID of a node somehow +type ID interface{} + +// key in a node, string for nodes.Object and int for nodes.Array +type Key interface{ isKey() } + +type String string +type Int int + +func (_ Int) isKey() {} +func (_ String) isKey() {} + +// four change types + +// create a node +type Create struct { + changeBase + node nodes.Node +} + +// delete a node by ID +type Delete struct { + changeBase + nodeID ID +} + +// attach a node as a child of another node with a given key +type Attach struct { + changeBase + parent ID + key Key + child ID +} + +// deattach a child from a node +type Deattach struct { + changeBase + parent ID + key Key //or string, how to do alternative? +} diff --git a/uast/diff/diff.go b/uast/diff/diff.go new file mode 100644 index 00000000..0b2f2e8a --- /dev/null +++ b/uast/diff/diff.go @@ -0,0 +1,283 @@ +package diff + +import ( + // TODO: integrate with https://github.com/src-d/lapjv if perf is unacceptable + "fmt" + "github.com/heetch/lapjv" + "gopkg.in/bblfsh/sdk.v2/uast/nodes" +) + +type decisionType interface { + isDecisionType() +} + +type basicDecisionType struct{} + +func (_ basicDecisionType) isDecisionType() {} + +type decision struct { + cost int + decision decisionType +} + +// match decision types together with their params +type sameDecision struct{ basicDecisionType } +type replaceDecision struct{ basicDecisionType } +type matchDecision struct{ basicDecisionType } +type permuteDecision struct { + basicDecisionType + permutation []int +} + +//convinience method for choosing the cheapest decision +func (self *decision) minEq(candidate *decision) { + if _, ok := candidate.decision.(replaceDecision); ok || self.cost > candidate.cost { + self.cost, self.decision = candidate.cost, candidate.decision + } +} + +//type for cache +type keyType struct{ k1, k2 ID } + +//cache for diff computation +type cacheStorage struct { + decisions map[keyType]decision + sizes map[ID]int + changes Changelist +} + +func emptyCacheStorage() cacheStorage { + return cacheStorage{ + make(map[keyType]decision), + make(map[ID]int), + make([]Change, 0), + } +} + +// caches (for perf) tree size (node count) +func (ds *cacheStorage) nodeSize(n nodes.Node) int { + label := nodes.UniqueKey(n) + if cnt, ok := ds.sizes[label]; ok { + return cnt + } + ret := nodes.Count(n, nodes.KindsNotNil) + ds.sizes[label] = ret + return ret +} + +// find the cheapest way to naively match src and dst and return the action with its combined cost +func (ds *cacheStorage) decideAction(src, dst nodes.Node) decision { + label := keyType{nodes.UniqueKey(src), nodes.UniqueKey(dst)} + + if val, ok := ds.decisions[label]; ok { + return val + } + + // one can always just create the dst ignoring the src + cost := ds.nodeSize(dst) + 1 + bestDecision := decision{cost, replaceDecision{}} + + if nodes.KindOf(src) != nodes.KindOf(dst) { + ds.decisions[label] = bestDecision + return bestDecision + } + + switch src.(type) { + + case nodes.Value: + src, dst := src.(nodes.Value), dst.(nodes.Value) + if src == dst { + bestDecision.minEq(&decision{0, sameDecision{}}) + } else { + bestDecision.minEq(&decision{1, replaceDecision{}}) + } + + case nodes.Object: + src, dst := src.(nodes.Object), dst.(nodes.Object) + cost = 0 + + keys := make(map[string]bool) + iterate := func(keyset nodes.Object) { + for key := range keyset { + if in := keys[key]; !in { + keys[key] = true + cost += ds.decideAction(src[key], dst[key]).cost + } + } + } + iterate(src) + iterate(dst) + + if cost == 0 { + bestDecision.minEq(&decision{cost, sameDecision{}}) + } else { + bestDecision.minEq(&decision{cost, matchDecision{}}) + } + + case nodes.Array: + src, dst := src.(nodes.Array), dst.(nodes.Array) + cost = 0 + if len(src) == len(dst) && func() int { + sum := 0 + for i := range src { + sum += ds.decideAction(src[i], dst[i]).cost + } + return sum + }() == 0 { + bestDecision.minEq(&decision{cost, sameDecision{}}) + break + } + + if len(src) != len(dst) { + cost = 2 + } + + if len(src) < len(dst) { + l := len(dst) - len(src) + for i := 0; i < l; i++ { + src = append(src, nil) + } + } else { + l := len(src) - len(dst) + for i := 0; i < l; i++ { + dst = append(dst, nil) + } + } + n := len(src) + m := make([][]int, n) + for i := 0; i < n; i++ { + m[i] = make([]int, n) + for j := 0; j < n; j++ { + m[i][j] = ds.decideAction(src[i], dst[j]).cost + } + } + + res := lapjv.Lapjv(m) + + for i1, i2 := range res.InRow { + if i1 != i2 { + cost = 2 + break + } + } + + cost += res.Cost + + bestDecision.minEq(&decision{cost, permuteDecision{permutation: res.InRow}}) + + case nil: + bestDecision.minEq(&decision{0, sameDecision{}}) + + default: + panic(fmt.Sprintf("unknown node type %T", src)) + } + + ds.decisions[label] = bestDecision + return ds.decisions[label] +} + +func (ds *cacheStorage) push(change Change) { + ds.changes = append(ds.changes, change) +} + +func (ds *cacheStorage) createRec(node nodes.Node) { + switch n := node.(type) { + case nodes.Object: + for _, v := range n { + ds.createRec(v) + } + + case nodes.Array: + for _, v := range n { + ds.createRec(v) + } + + default: + //values and nils are not saved separately + return + } + ds.push(&Create{node: node}) +} + +func (ds *cacheStorage) generateDifference(src, dst nodes.Node, parentID ID, parentKey Key) { + decision := ds.decideAction(src, dst) + switch d := decision.decision.(type) { + + //no action required if same + case sameDecision: + + case replaceDecision: + //remove src (no action?) and create dst + attach it + if dst != nil { + ds.createRec(dst) + ds.push(&Attach{parent: parentID, key: parentKey, child: nodes.UniqueKey(dst)}) + } else { + ds.push(&Attach{parent: parentID, key: parentKey, child: nil}) + } + + case matchDecision: + src, dst := src.(nodes.Object), dst.(nodes.Object) + keys := make(map[string]bool) + iterate := func(keyset nodes.Object) { + for key := range keyset { + if in := keys[key]; !in { + keys[key] = true + if _, ok := dst[key]; !ok { + ds.push(&Deattach{parent: nodes.UniqueKey(src), key: String(key)}) + } else { + ds.generateDifference(src[key], dst[key], nodes.UniqueKey(src), String(key)) + } + } + } + } + iterate(src) + iterate(dst) + + case permuteDecision: + src, dst := src.(nodes.Array), dst.(nodes.Array) + l := len(dst) - len(src) + //add possible nils to src + if l > 0 { + for i := 0; i < l; i++ { + src = append(src, nil) + } + } + recreate := false + if l != 0 { + recreate = true + } + for i1, i2 := range d.permutation { + if i1 != i2 { + recreate = true + break + } + } + if recreate { + //recreate src with right perm + newsrc := make([]nodes.Node, 0, len(dst)) + for i := 0; i < len(dst); i++ { + newsrc = append(newsrc, src[d.permutation[i]]) + } + src = newsrc + ds.push(&Create{node: src}) // TODO: not create, only mutate... + ds.push(&Attach{parent: parentID, key: parentKey, child: nodes.UniqueKey(src)}) + } + for i := 0; i < len(dst); i++ { + ds.generateDifference(src[i], dst[i], nodes.UniqueKey(src), Int(i)) + } + + default: + panic(fmt.Sprintf("unknown decision %v", d)) + } +} + +func Cost(src, dst nodes.Node) int { + ds := emptyCacheStorage() + return ds.decideAction(src, dst).cost +} + +func Changes(src, dst nodes.Node) Changelist { + ds := emptyCacheStorage() + ds.generateDifference(src, dst, nil, Int(0)) + return ds.changes +} From 230391ccd16fdd430775620e39328a48272b2275 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojciech=20Jab=C5=82o=C5=84ski?= Date: Fri, 21 Sep 2018 16:14:30 +0200 Subject: [PATCH 02/12] fixed style/PR notes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Wojciech Jabłoński --- uast/diff/changelist.go | 8 ++-- uast/diff/diff.go | 96 +++++++++++++++++++++-------------------- 2 files changed, 54 insertions(+), 50 deletions(-) diff --git a/uast/diff/changelist.go b/uast/diff/changelist.go index 6a75be26..badc7168 100644 --- a/uast/diff/changelist.go +++ b/uast/diff/changelist.go @@ -14,7 +14,7 @@ type changeBase struct { txID uint64 } -func (_ *changeBase) isChange() {} +func (changeBase) isChange() {} // TODO: proper ID of a node somehow type ID interface{} @@ -25,12 +25,12 @@ type Key interface{ isKey() } type String string type Int int -func (_ Int) isKey() {} -func (_ String) isKey() {} +func (Int) isKey() {} +func (String) isKey() {} // four change types -// create a node +// Create a node. Each array and object is created separately. type Create struct { changeBase node nodes.Node diff --git a/uast/diff/diff.go b/uast/diff/diff.go index 0b2f2e8a..984be777 100644 --- a/uast/diff/diff.go +++ b/uast/diff/diff.go @@ -1,7 +1,6 @@ package diff import ( - // TODO: integrate with https://github.com/src-d/lapjv if perf is unacceptable "fmt" "github.com/heetch/lapjv" "gopkg.in/bblfsh/sdk.v2/uast/nodes" @@ -9,30 +8,32 @@ import ( type decisionType interface { isDecisionType() + cost() int } -type basicDecisionType struct{} +type basicDecision struct { + privateCost int +} -func (_ basicDecisionType) isDecisionType() {} +func (basicDecision) isDecisionType() {} -type decision struct { - cost int - decision decisionType -} +func (b basicDecision) cost() int { return b.privateCost } // match decision types together with their params -type sameDecision struct{ basicDecisionType } -type replaceDecision struct{ basicDecisionType } -type matchDecision struct{ basicDecisionType } +type sameDecision struct{ basicDecision } +type replaceDecision struct{ basicDecision } +type matchDecision struct{ basicDecision } type permuteDecision struct { - basicDecisionType + basicDecision permutation []int } //convinience method for choosing the cheapest decision -func (self *decision) minEq(candidate *decision) { - if _, ok := candidate.decision.(replaceDecision); ok || self.cost > candidate.cost { - self.cost, self.decision = candidate.cost, candidate.decision +func min(self, candidate decisionType) decisionType { + if self.cost() > candidate.cost() { + return candidate + } else { + return self } } @@ -41,16 +42,16 @@ type keyType struct{ k1, k2 ID } //cache for diff computation type cacheStorage struct { - decisions map[keyType]decision + decisions map[keyType]decisionType sizes map[ID]int changes Changelist } func emptyCacheStorage() cacheStorage { return cacheStorage{ - make(map[keyType]decision), + make(map[keyType]decisionType), make(map[ID]int), - make([]Change, 0), + nil, } } @@ -66,7 +67,7 @@ func (ds *cacheStorage) nodeSize(n nodes.Node) int { } // find the cheapest way to naively match src and dst and return the action with its combined cost -func (ds *cacheStorage) decideAction(src, dst nodes.Node) decision { +func (ds *cacheStorage) decideAction(src, dst nodes.Node) decisionType { label := keyType{nodes.UniqueKey(src), nodes.UniqueKey(dst)} if val, ok := ds.decisions[label]; ok { @@ -75,7 +76,9 @@ func (ds *cacheStorage) decideAction(src, dst nodes.Node) decision { // one can always just create the dst ignoring the src cost := ds.nodeSize(dst) + 1 - bestDecision := decision{cost, replaceDecision{}} + + var bestDecision decisionType + bestDecision = replaceDecision{basicDecision{cost}} if nodes.KindOf(src) != nodes.KindOf(dst) { ds.decisions[label] = bestDecision @@ -86,10 +89,12 @@ func (ds *cacheStorage) decideAction(src, dst nodes.Node) decision { case nodes.Value: src, dst := src.(nodes.Value), dst.(nodes.Value) + cost = 0 if src == dst { - bestDecision.minEq(&decision{0, sameDecision{}}) + bestDecision = min(bestDecision, sameDecision{basicDecision{cost}}) } else { - bestDecision.minEq(&decision{1, replaceDecision{}}) + cost = 1 + bestDecision = min(bestDecision, replaceDecision{basicDecision{cost}}) } case nodes.Object: @@ -101,7 +106,7 @@ func (ds *cacheStorage) decideAction(src, dst nodes.Node) decision { for key := range keyset { if in := keys[key]; !in { keys[key] = true - cost += ds.decideAction(src[key], dst[key]).cost + cost += ds.decideAction(src[key], dst[key]).cost() } } } @@ -109,9 +114,9 @@ func (ds *cacheStorage) decideAction(src, dst nodes.Node) decision { iterate(dst) if cost == 0 { - bestDecision.minEq(&decision{cost, sameDecision{}}) + bestDecision = min(bestDecision, sameDecision{basicDecision{cost}}) } else { - bestDecision.minEq(&decision{cost, matchDecision{}}) + bestDecision = min(bestDecision, matchDecision{basicDecision{cost}}) } case nodes.Array: @@ -120,11 +125,11 @@ func (ds *cacheStorage) decideAction(src, dst nodes.Node) decision { if len(src) == len(dst) && func() int { sum := 0 for i := range src { - sum += ds.decideAction(src[i], dst[i]).cost + sum += ds.decideAction(src[i], dst[i]).cost() } return sum }() == 0 { - bestDecision.minEq(&decision{cost, sameDecision{}}) + bestDecision = min(bestDecision, sameDecision{basicDecision{cost}}) break } @@ -133,22 +138,20 @@ func (ds *cacheStorage) decideAction(src, dst nodes.Node) decision { } if len(src) < len(dst) { - l := len(dst) - len(src) - for i := 0; i < l; i++ { - src = append(src, nil) - } + arr := make(nodes.Array, len(dst)) + copy(arr, src) + src = arr } else { - l := len(src) - len(dst) - for i := 0; i < l; i++ { - dst = append(dst, nil) - } + arr := make(nodes.Array, len(src)) + copy(arr, dst) + dst = arr } n := len(src) m := make([][]int, n) for i := 0; i < n; i++ { m[i] = make([]int, n) for j := 0; j < n; j++ { - m[i][j] = ds.decideAction(src[i], dst[j]).cost + m[i][j] = ds.decideAction(src[i], dst[j]).cost() } } @@ -163,13 +166,14 @@ func (ds *cacheStorage) decideAction(src, dst nodes.Node) decision { cost += res.Cost - bestDecision.minEq(&decision{cost, permuteDecision{permutation: res.InRow}}) + bestDecision = min(bestDecision, permuteDecision{basicDecision{cost}, res.InRow}) case nil: - bestDecision.minEq(&decision{0, sameDecision{}}) + cost = 0 + bestDecision = min(bestDecision, sameDecision{basicDecision{cost}}) default: - panic(fmt.Sprintf("unknown node type %T", src)) + panic(fmt.Errorf("unknown node type %T", src)) } ds.decisions[label] = bestDecision @@ -201,7 +205,7 @@ func (ds *cacheStorage) createRec(node nodes.Node) { func (ds *cacheStorage) generateDifference(src, dst nodes.Node, parentID ID, parentKey Key) { decision := ds.decideAction(src, dst) - switch d := decision.decision.(type) { + switch d := decision.(type) { //no action required if same case sameDecision: @@ -238,9 +242,9 @@ func (ds *cacheStorage) generateDifference(src, dst nodes.Node, parentID ID, par l := len(dst) - len(src) //add possible nils to src if l > 0 { - for i := 0; i < l; i++ { - src = append(src, nil) - } + arr := make(nodes.Array, len(dst)) + copy(arr, src) + src = arr } recreate := false if l != 0 { @@ -254,9 +258,9 @@ func (ds *cacheStorage) generateDifference(src, dst nodes.Node, parentID ID, par } if recreate { //recreate src with right perm - newsrc := make([]nodes.Node, 0, len(dst)) + newsrc := make([]nodes.Node, len(dst)) for i := 0; i < len(dst); i++ { - newsrc = append(newsrc, src[d.permutation[i]]) + newsrc[i] = src[d.permutation[i]] } src = newsrc ds.push(&Create{node: src}) // TODO: not create, only mutate... @@ -267,13 +271,13 @@ func (ds *cacheStorage) generateDifference(src, dst nodes.Node, parentID ID, par } default: - panic(fmt.Sprintf("unknown decision %v", d)) + panic(fmt.Errorf("unknown decision %v", d)) } } func Cost(src, dst nodes.Node) int { ds := emptyCacheStorage() - return ds.decideAction(src, dst).cost + return ds.decideAction(src, dst).cost() } func Changes(src, dst nodes.Node) Changelist { From da7c1494e82ec4dc9af8878433b6a232c1db3d8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojciech=20Jab=C5=82o=C5=84ski?= Date: Fri, 21 Sep 2018 16:39:09 +0200 Subject: [PATCH 03/12] added a skeleton of diff apply function MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Wojciech Jabłoński --- uast/diff/apply.go | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 uast/diff/apply.go diff --git a/uast/diff/apply.go b/uast/diff/apply.go new file mode 100644 index 00000000..2b307165 --- /dev/null +++ b/uast/diff/apply.go @@ -0,0 +1,21 @@ +package diff + +import ( + "fmt" + "gopkg.in/bblfsh/sdk.v2/uast/nodes" +) + +func Apply(tree nodes.Node, changelist Changelist) nodes.Node { + for _, change := range changelist { + switch change.(type) { + case Create: + case Delete: + panic("delete is not supported!") + case Attach: + case Deattach: + default: + panic(fmt.Sprintf("unknown change %T of type %v", change, change)) + } + } + return tree +} From cd6e161ad7c39c8acb1851d60a8cfeda7d4c7747 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojciech=20Jab=C5=82o=C5=84ski?= Date: Fri, 21 Sep 2018 17:51:44 +0200 Subject: [PATCH 04/12] the diff seems to be appliable MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Wojciech Jabłoński --- uast/diff/apply.go | 59 ++++++++++++++++++++++++++++++++++++----- uast/diff/changelist.go | 20 +++++++------- uast/diff/diff.go | 12 ++++----- 3 files changed, 70 insertions(+), 21 deletions(-) diff --git a/uast/diff/apply.go b/uast/diff/apply.go index 2b307165..f3889b32 100644 --- a/uast/diff/apply.go +++ b/uast/diff/apply.go @@ -5,17 +5,64 @@ import ( "gopkg.in/bblfsh/sdk.v2/uast/nodes" ) -func Apply(tree nodes.Node, changelist Changelist) nodes.Node { +func Apply(root nodes.Node, changelist Changelist) nodes.Node { + nodeDict := make(map[ID]nodes.Node) + nodes.WalkPreOrder(root, func(node nodes.Node) bool { + nodeDict[nodes.UniqueKey(node)] = node + return true + }) + for _, change := range changelist { - switch change.(type) { + switch ch := change.(type) { case Create: - case Delete: - panic("delete is not supported!") + //create a node and add to the dictionary + nodeDict[nodes.UniqueKey(ch.Node)] = ch.Node + case Attach: + //get src and chld from the dictionary, attach (modify src) + parent, ok := nodeDict[ch.Parent] + if !ok { + panic("I don't know what to get attached to!") + } + child, ok := nodeDict[ch.Child] + if !ok { + child, ok = ch.Child.(nodes.Value) + if !ok { + panic(fmt.Errorf("I don't know what type of child is %v (type %v)", ch.Child, ch.Child)) + } + } + + switch key := ch.Key.(type) { + + case String: + parent := parent.(nodes.Object) + parent[string(key)] = child + + case Int: + parent := parent.(nodes.Array) + parent[int(key)] = child + } + case Deattach: + //get the src from the dictionary, deattach (modify src) + parent := nodeDict[ch.Parent] + + switch key := ch.Key.(type) { + + case String: + parent := parent.(nodes.Object) + delete(parent, string(key)) + + case Int: + panic(fmt.Errorf("cannot deattach from an Array!")) + } + + case Delete: + panic(fmt.Errorf("delete is not supported in a Changelist!")) + default: - panic(fmt.Sprintf("unknown change %T of type %v", change, change)) + panic(fmt.Sprintf("unknown change %v of type %T", change, change)) } } - return tree + return root } diff --git a/uast/diff/changelist.go b/uast/diff/changelist.go index badc7168..28951090 100644 --- a/uast/diff/changelist.go +++ b/uast/diff/changelist.go @@ -8,16 +8,18 @@ type Changelist []Change type Change interface { isChange() + TransactionID() uint64 } type changeBase struct { txID uint64 } -func (changeBase) isChange() {} +func (changeBase) isChange() {} +func (ch changeBase) TransactionID() uint64 { return ch.txID } // TODO: proper ID of a node somehow -type ID interface{} +type ID nodes.Comparable // key in a node, string for nodes.Object and int for nodes.Array type Key interface{ isKey() } @@ -33,26 +35,26 @@ func (String) isKey() {} // Create a node. Each array and object is created separately. type Create struct { changeBase - node nodes.Node + Node nodes.Node } // delete a node by ID type Delete struct { changeBase - nodeID ID + NodeID ID } // attach a node as a child of another node with a given key type Attach struct { changeBase - parent ID - key Key - child ID + Parent ID + Key Key + Child ID } // deattach a child from a node type Deattach struct { changeBase - parent ID - key Key //or string, how to do alternative? + Parent ID + Key Key //or string, how to do alternative? } diff --git a/uast/diff/diff.go b/uast/diff/diff.go index 984be777..a48680e4 100644 --- a/uast/diff/diff.go +++ b/uast/diff/diff.go @@ -200,7 +200,7 @@ func (ds *cacheStorage) createRec(node nodes.Node) { //values and nils are not saved separately return } - ds.push(&Create{node: node}) + ds.push(Create{Node: node}) } func (ds *cacheStorage) generateDifference(src, dst nodes.Node, parentID ID, parentKey Key) { @@ -214,9 +214,9 @@ func (ds *cacheStorage) generateDifference(src, dst nodes.Node, parentID ID, par //remove src (no action?) and create dst + attach it if dst != nil { ds.createRec(dst) - ds.push(&Attach{parent: parentID, key: parentKey, child: nodes.UniqueKey(dst)}) + ds.push(Attach{Parent: parentID, Key: parentKey, Child: nodes.UniqueKey(dst)}) } else { - ds.push(&Attach{parent: parentID, key: parentKey, child: nil}) + ds.push(Attach{Parent: parentID, Key: parentKey, Child: nil}) } case matchDecision: @@ -227,7 +227,7 @@ func (ds *cacheStorage) generateDifference(src, dst nodes.Node, parentID ID, par if in := keys[key]; !in { keys[key] = true if _, ok := dst[key]; !ok { - ds.push(&Deattach{parent: nodes.UniqueKey(src), key: String(key)}) + ds.push(Deattach{Parent: nodes.UniqueKey(src), Key: String(key)}) } else { ds.generateDifference(src[key], dst[key], nodes.UniqueKey(src), String(key)) } @@ -263,8 +263,8 @@ func (ds *cacheStorage) generateDifference(src, dst nodes.Node, parentID ID, par newsrc[i] = src[d.permutation[i]] } src = newsrc - ds.push(&Create{node: src}) // TODO: not create, only mutate... - ds.push(&Attach{parent: parentID, key: parentKey, child: nodes.UniqueKey(src)}) + ds.push(Create{Node: src}) // TODO: not create, only mutate... + ds.push(Attach{Parent: parentID, Key: parentKey, Child: nodes.UniqueKey(src)}) } for i := 0; i < len(dst); i++ { ds.generateDifference(src[i], dst[i], nodes.UniqueKey(src), Int(i)) From 2e69a6897c424eb6e34650bfa0fdc3f7590bb471 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojciech=20Jab=C5=82o=C5=84ski?= Date: Sat, 10 Nov 2018 14:30:14 +0100 Subject: [PATCH 05/12] Code cleanup and several bugfixes in the diff library MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Wojciech Jabłoński --- uast/diff/apply.go | 12 +++--- uast/diff/changelist.go | 4 +- uast/diff/diff.go | 83 +++++++++++++++++++++-------------------- 3 files changed, 51 insertions(+), 48 deletions(-) diff --git a/uast/diff/apply.go b/uast/diff/apply.go index f3889b32..e7e54507 100644 --- a/uast/diff/apply.go +++ b/uast/diff/apply.go @@ -22,13 +22,13 @@ func Apply(root nodes.Node, changelist Changelist) nodes.Node { //get src and chld from the dictionary, attach (modify src) parent, ok := nodeDict[ch.Parent] if !ok { - panic("I don't know what to get attached to!") + panic("invalid attachment point") } child, ok := nodeDict[ch.Child] if !ok { child, ok = ch.Child.(nodes.Value) if !ok { - panic(fmt.Errorf("I don't know what type of child is %v (type %v)", ch.Child, ch.Child)) + panic(fmt.Errorf("unknown type of a child: %v (type %T)", ch.Child, ch.Child)) } } @@ -43,8 +43,8 @@ func Apply(root nodes.Node, changelist Changelist) nodes.Node { parent[int(key)] = child } - case Deattach: - //get the src from the dictionary, deattach (modify src) + case Deatach: + //get the src from the dictionary, deatach (modify src) parent := nodeDict[ch.Parent] switch key := ch.Key.(type) { @@ -54,11 +54,11 @@ func Apply(root nodes.Node, changelist Changelist) nodes.Node { delete(parent, string(key)) case Int: - panic(fmt.Errorf("cannot deattach from an Array!")) + panic(fmt.Errorf("cannot deatach from an Array")) } case Delete: - panic(fmt.Errorf("delete is not supported in a Changelist!")) + panic(fmt.Errorf("delete is not supported in a Changelist")) default: panic(fmt.Sprintf("unknown change %v of type %T", change, change)) diff --git a/uast/diff/changelist.go b/uast/diff/changelist.go index 28951090..19bdd3ec 100644 --- a/uast/diff/changelist.go +++ b/uast/diff/changelist.go @@ -52,8 +52,8 @@ type Attach struct { Child ID } -// deattach a child from a node -type Deattach struct { +// deatach a child from a node +type Deatach struct { changeBase Parent ID Key Key //or string, how to do alternative? diff --git a/uast/diff/diff.go b/uast/diff/diff.go index a48680e4..5e93d45a 100644 --- a/uast/diff/diff.go +++ b/uast/diff/diff.go @@ -7,7 +7,6 @@ import ( ) type decisionType interface { - isDecisionType() cost() int } @@ -15,8 +14,6 @@ type basicDecision struct { privateCost int } -func (basicDecision) isDecisionType() {} - func (b basicDecision) cost() int { return b.privateCost } // match decision types together with their params @@ -28,7 +25,7 @@ type permuteDecision struct { permutation []int } -//convinience method for choosing the cheapest decision +//min is a convinience method for choosing the cheapest decision func min(self, candidate decisionType) decisionType { if self.cost() > candidate.cost() { return candidate @@ -43,30 +40,30 @@ type keyType struct{ k1, k2 ID } //cache for diff computation type cacheStorage struct { decisions map[keyType]decisionType - sizes map[ID]int + counts map[ID]int changes Changelist } -func emptyCacheStorage() cacheStorage { - return cacheStorage{ - make(map[keyType]decisionType), - make(map[ID]int), - nil, +func makeCacheStorage() *cacheStorage { + return &cacheStorage{ + decisions: make(map[keyType]decisionType), + counts: make(map[ID]int), } } -// caches (for perf) tree size (node count) +// nodeSize caches (for perf) tree size (node count) func (ds *cacheStorage) nodeSize(n nodes.Node) int { label := nodes.UniqueKey(n) - if cnt, ok := ds.sizes[label]; ok { + if cnt, ok := ds.counts[label]; ok { return cnt } ret := nodes.Count(n, nodes.KindsNotNil) - ds.sizes[label] = ret + ds.counts[label] = ret return ret } -// find the cheapest way to naively match src and dst and return the action with its combined cost +// decideAction finds the cheapest way to naively match src and dst and returns this action +// with its combined cost func (ds *cacheStorage) decideAction(src, dst nodes.Node) decisionType { label := keyType{nodes.UniqueKey(src), nodes.UniqueKey(dst)} @@ -74,7 +71,8 @@ func (ds *cacheStorage) decideAction(src, dst nodes.Node) decisionType { return val } - // one can always just create the dst ignoring the src + // the default (but not always optimal) decision is to ignore the existance of src and just + // create the desired dst; implemented below cost := ds.nodeSize(dst) + 1 var bestDecision decisionType @@ -85,10 +83,12 @@ func (ds *cacheStorage) decideAction(src, dst nodes.Node) decisionType { return bestDecision } - switch src.(type) { + // from now on src.(type) == dst.(type) + + switch src := src.(type) { case nodes.Value: - src, dst := src.(nodes.Value), dst.(nodes.Value) + dst := dst.(nodes.Value) cost = 0 if src == dst { bestDecision = min(bestDecision, sameDecision{basicDecision{cost}}) @@ -98,9 +98,11 @@ func (ds *cacheStorage) decideAction(src, dst nodes.Node) decisionType { } case nodes.Object: - src, dst := src.(nodes.Object), dst.(nodes.Object) + dst := dst.(nodes.Object) cost = 0 + // the code below iterates over each of the keys from src and dst exactly once, that's why + // keys isn't reset between iterations. keys := make(map[string]bool) iterate := func(keyset nodes.Object) { for key := range keyset { @@ -120,17 +122,17 @@ func (ds *cacheStorage) decideAction(src, dst nodes.Node) decisionType { } case nodes.Array: - src, dst := src.(nodes.Array), dst.(nodes.Array) + dst := dst.(nodes.Array) cost = 0 - if len(src) == len(dst) && func() int { + if len(src) == len(dst) { sum := 0 for i := range src { sum += ds.decideAction(src[i], dst[i]).cost() } - return sum - }() == 0 { - bestDecision = min(bestDecision, sameDecision{basicDecision{cost}}) - break + if sum == 0 { + bestDecision = min(bestDecision, sameDecision{basicDecision{cost}}) + break + } } if len(src) != len(dst) { @@ -141,16 +143,16 @@ func (ds *cacheStorage) decideAction(src, dst nodes.Node) decisionType { arr := make(nodes.Array, len(dst)) copy(arr, src) src = arr - } else { + } else if len(src) > len(dst) { arr := make(nodes.Array, len(src)) copy(arr, dst) dst = arr } n := len(src) m := make([][]int, n) - for i := 0; i < n; i++ { + for i := range src { m[i] = make([]int, n) - for j := 0; j < n; j++ { + for j := range dst { m[i][j] = ds.decideAction(src[i], dst[j]).cost() } } @@ -197,21 +199,20 @@ func (ds *cacheStorage) createRec(node nodes.Node) { } default: - //values and nils are not saved separately + // values and nils are not saved separately return } ds.push(Create{Node: node}) } func (ds *cacheStorage) generateDifference(src, dst nodes.Node, parentID ID, parentKey Key) { - decision := ds.decideAction(src, dst) - switch d := decision.(type) { + switch d := ds.decideAction(src, dst).(type) { - //no action required if same + // no action required if same case sameDecision: case replaceDecision: - //remove src (no action?) and create dst + attach it + // remove src (no action?) and create dst + attach it if dst != nil { ds.createRec(dst) ds.push(Attach{Parent: parentID, Key: parentKey, Child: nodes.UniqueKey(dst)}) @@ -227,7 +228,7 @@ func (ds *cacheStorage) generateDifference(src, dst nodes.Node, parentID ID, par if in := keys[key]; !in { keys[key] = true if _, ok := dst[key]; !ok { - ds.push(Deattach{Parent: nodes.UniqueKey(src), Key: String(key)}) + ds.push(Deatach{Parent: nodes.UniqueKey(src), Key: String(key)}) } else { ds.generateDifference(src[key], dst[key], nodes.UniqueKey(src), String(key)) } @@ -240,7 +241,7 @@ func (ds *cacheStorage) generateDifference(src, dst nodes.Node, parentID ID, par case permuteDecision: src, dst := src.(nodes.Array), dst.(nodes.Array) l := len(dst) - len(src) - //add possible nils to src + // add possible nils to src if l > 0 { arr := make(nodes.Array, len(dst)) copy(arr, src) @@ -257,10 +258,10 @@ func (ds *cacheStorage) generateDifference(src, dst nodes.Node, parentID ID, par } } if recreate { - //recreate src with right perm - newsrc := make([]nodes.Node, len(dst)) - for i := 0; i < len(dst); i++ { - newsrc[i] = src[d.permutation[i]] + // recreate src with right perm + newsrc := make([]nodes.Node, 0, len(dst)) + for i := range dst { + newsrc = append(newsrc, src[d.permutation[i]]) } src = newsrc ds.push(Create{Node: src}) // TODO: not create, only mutate... @@ -276,12 +277,14 @@ func (ds *cacheStorage) generateDifference(src, dst nodes.Node, parentID ID, par } func Cost(src, dst nodes.Node) int { - ds := emptyCacheStorage() + ds := makeCacheStorage() return ds.decideAction(src, dst).cost() } func Changes(src, dst nodes.Node) Changelist { - ds := emptyCacheStorage() + ds := makeCacheStorage() + fmt.Println(ds.nodeSize(src)) + fmt.Println(ds.nodeSize(dst)) ds.generateDifference(src, dst, nil, Int(0)) return ds.changes } From b329d1b382933060a233e2f8697d4ef458589239 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojciech=20Jab=C5=82o=C5=84ski?= Date: Sat, 10 Nov 2018 16:59:39 +0100 Subject: [PATCH 06/12] fixed a bug when creating/deleting "nil" child MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Wojciech Jabłoński --- uast/diff/diff.go | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/uast/diff/diff.go b/uast/diff/diff.go index 5e93d45a..6743641b 100644 --- a/uast/diff/diff.go +++ b/uast/diff/diff.go @@ -229,8 +229,16 @@ func (ds *cacheStorage) generateDifference(src, dst nodes.Node, parentID ID, par keys[key] = true if _, ok := dst[key]; !ok { ds.push(Deatach{Parent: nodes.UniqueKey(src), Key: String(key)}) + } else if _, ok := src[key]; !ok { + ds.createRec(dst[key]) + ds.push(Attach{ + Parent: nodes.UniqueKey(src), + Key: String(key), + Child: nodes.UniqueKey(dst[key]), + }) } else { - ds.generateDifference(src[key], dst[key], nodes.UniqueKey(src), String(key)) + ds.generateDifference( + src[key], dst[key], nodes.UniqueKey(src), String(key)) } } } @@ -283,8 +291,6 @@ func Cost(src, dst nodes.Node) int { func Changes(src, dst nodes.Node) Changelist { ds := makeCacheStorage() - fmt.Println(ds.nodeSize(src)) - fmt.Println(ds.nodeSize(dst)) ds.generateDifference(src, dst, nil, Int(0)) return ds.changes } From 32fccbcf356080218d7eb2198276e6236b844107 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojciech=20Jab=C5=82o=C5=84ski?= Date: Sat, 10 Nov 2018 20:17:03 +0100 Subject: [PATCH 07/12] basic tests added MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Wojciech Jabłoński --- uast/diff/changelist_test.go | 44 + uast/diff/testdata/config.txt | 1 + uast/diff/testdata/create_testdata.py | 36 + uast/diff/testdata/smalltest.txt | 148 + uast/diff/testdata/testcase_0_dst.uast | 69 + uast/diff/testdata/testcase_0_src.uast | 317 + uast/diff/testdata/testcase_100_dst.uast | 1266 ++++ uast/diff/testdata/testcase_100_src.uast | 1295 ++++ uast/diff/testdata/testcase_101_dst.uast | 681 ++ uast/diff/testdata/testcase_101_src.uast | 636 ++ uast/diff/testdata/testcase_102_dst.uast | 681 ++ uast/diff/testdata/testcase_102_src.uast | 681 ++ uast/diff/testdata/testcase_103_dst.uast | 681 ++ uast/diff/testdata/testcase_103_src.uast | 681 ++ uast/diff/testdata/testcase_104_dst.uast | 681 ++ uast/diff/testdata/testcase_104_src.uast | 681 ++ uast/diff/testdata/testcase_105_dst.uast | 681 ++ uast/diff/testdata/testcase_105_src.uast | 681 ++ uast/diff/testdata/testcase_106_dst.uast | 681 ++ uast/diff/testdata/testcase_106_src.uast | 681 ++ uast/diff/testdata/testcase_107_dst.uast | 652 ++ uast/diff/testdata/testcase_107_src.uast | 681 ++ uast/diff/testdata/testcase_108_dst.uast | 1625 ++++ uast/diff/testdata/testcase_108_src.uast | 1578 ++++ uast/diff/testdata/testcase_109_dst.uast | 1674 +++++ uast/diff/testdata/testcase_109_src.uast | 1625 ++++ uast/diff/testdata/testcase_10_dst.uast | 398 + uast/diff/testdata/testcase_10_src.uast | 69 + uast/diff/testdata/testcase_110_dst.uast | 1719 +++++ uast/diff/testdata/testcase_110_src.uast | 1674 +++++ uast/diff/testdata/testcase_111_dst.uast | 3016 ++++++++ uast/diff/testdata/testcase_111_src.uast | 1217 +++ uast/diff/testdata/testcase_112_dst.uast | 1430 ++++ uast/diff/testdata/testcase_112_src.uast | 1996 +++++ uast/diff/testdata/testcase_113_dst.uast | 843 +++ uast/diff/testdata/testcase_113_src.uast | 1430 ++++ uast/diff/testdata/testcase_114_dst.uast | 1673 +++++ uast/diff/testdata/testcase_114_src.uast | 1647 +++++ uast/diff/testdata/testcase_115_dst.uast | 683 ++ uast/diff/testdata/testcase_115_src.uast | 652 ++ uast/diff/testdata/testcase_116_dst.uast | 694 ++ uast/diff/testdata/testcase_116_src.uast | 683 ++ uast/diff/testdata/testcase_117_dst.uast | 497 ++ uast/diff/testdata/testcase_117_src.uast | 1719 +++++ uast/diff/testdata/testcase_118_dst.uast | 694 ++ uast/diff/testdata/testcase_118_src.uast | 683 ++ uast/diff/testdata/testcase_119_dst.uast | 694 ++ uast/diff/testdata/testcase_119_src.uast | 694 ++ uast/diff/testdata/testcase_11_dst.uast | 317 + uast/diff/testdata/testcase_11_src.uast | 187 + uast/diff/testdata/testcase_120_dst.uast | 1719 +++++ uast/diff/testdata/testcase_120_src.uast | 1674 +++++ uast/diff/testdata/testcase_121_dst.uast | 694 ++ uast/diff/testdata/testcase_121_src.uast | 694 ++ uast/diff/testdata/testcase_122_dst.uast | 694 ++ uast/diff/testdata/testcase_122_src.uast | 694 ++ uast/diff/testdata/testcase_123_dst.uast | 702 ++ uast/diff/testdata/testcase_123_src.uast | 694 ++ uast/diff/testdata/testcase_124_dst.uast | 1482 ++++ uast/diff/testdata/testcase_124_src.uast | 1482 ++++ uast/diff/testdata/testcase_125_dst.uast | 1448 ++++ uast/diff/testdata/testcase_125_src.uast | 1448 ++++ uast/diff/testdata/testcase_126_dst.uast | 1504 ++++ uast/diff/testdata/testcase_126_src.uast | 1448 ++++ uast/diff/testdata/testcase_127_dst.uast | 1482 ++++ uast/diff/testdata/testcase_127_src.uast | 1494 ++++ uast/diff/testdata/testcase_128_dst.uast | 1482 ++++ uast/diff/testdata/testcase_128_src.uast | 1482 ++++ uast/diff/testdata/testcase_129_dst.uast | 702 ++ uast/diff/testdata/testcase_129_src.uast | 694 ++ uast/diff/testdata/testcase_12_dst.uast | 69 + uast/diff/testdata/testcase_12_src.uast | 317 + uast/diff/testdata/testcase_130_dst.uast | 710 ++ uast/diff/testdata/testcase_130_src.uast | 702 ++ uast/diff/testdata/testcase_131_dst.uast | 718 ++ uast/diff/testdata/testcase_131_src.uast | 710 ++ uast/diff/testdata/testcase_132_dst.uast | 1088 +++ uast/diff/testdata/testcase_132_src.uast | 1062 +++ uast/diff/testdata/testcase_133_dst.uast | 1088 +++ uast/diff/testdata/testcase_133_src.uast | 1088 +++ uast/diff/testdata/testcase_134_dst.uast | 1504 ++++ uast/diff/testdata/testcase_134_src.uast | 1448 ++++ uast/diff/testdata/testcase_135_dst.uast | 1494 ++++ uast/diff/testdata/testcase_135_src.uast | 8556 ++++++++++++++++++++++ uast/diff/testdata/testcase_136_dst.uast | 1482 ++++ uast/diff/testdata/testcase_136_src.uast | 1494 ++++ uast/diff/testdata/testcase_137_dst.uast | 255 + uast/diff/testdata/testcase_137_src.uast | 1088 +++ uast/diff/testdata/testcase_138_dst.uast | 1504 ++++ uast/diff/testdata/testcase_138_src.uast | 1504 ++++ uast/diff/testdata/testcase_139_dst.uast | 1638 +++++ uast/diff/testdata/testcase_139_src.uast | 1504 ++++ uast/diff/testdata/testcase_13_dst.uast | 323 + uast/diff/testdata/testcase_13_src.uast | 498 ++ uast/diff/testdata/testcase_140_dst.uast | 718 ++ uast/diff/testdata/testcase_140_src.uast | 710 ++ uast/diff/testdata/testcase_141_dst.uast | 726 ++ uast/diff/testdata/testcase_141_src.uast | 718 ++ uast/diff/testdata/testcase_142_dst.uast | 1681 +++++ uast/diff/testdata/testcase_142_src.uast | 1681 +++++ uast/diff/testdata/testcase_143_dst.uast | 1673 +++++ uast/diff/testdata/testcase_143_src.uast | 1647 +++++ uast/diff/testdata/testcase_144_dst.uast | 1673 +++++ uast/diff/testdata/testcase_144_src.uast | 1673 +++++ uast/diff/testdata/testcase_145_dst.uast | 726 ++ uast/diff/testdata/testcase_145_src.uast | 718 ++ uast/diff/testdata/testcase_146_dst.uast | 726 ++ uast/diff/testdata/testcase_146_src.uast | 726 ++ uast/diff/testdata/testcase_147_dst.uast | 726 ++ uast/diff/testdata/testcase_147_src.uast | 726 ++ uast/diff/testdata/testcase_14_dst.uast | 472 ++ uast/diff/testdata/testcase_14_src.uast | 323 + uast/diff/testdata/testcase_15_dst.uast | 682 ++ uast/diff/testdata/testcase_15_src.uast | 656 ++ uast/diff/testdata/testcase_16_dst.uast | 321 + uast/diff/testdata/testcase_16_src.uast | 321 + uast/diff/testdata/testcase_17_dst.uast | 425 ++ uast/diff/testdata/testcase_17_src.uast | 425 ++ uast/diff/testdata/testcase_18_dst.uast | 251 + uast/diff/testdata/testcase_18_src.uast | 208 + uast/diff/testdata/testcase_19_dst.uast | 325 + uast/diff/testdata/testcase_19_src.uast | 234 + uast/diff/testdata/testcase_1_dst.uast | 69 + uast/diff/testdata/testcase_1_src.uast | 69 + uast/diff/testdata/testcase_20_dst.uast | 323 + uast/diff/testdata/testcase_20_src.uast | 498 ++ uast/diff/testdata/testcase_21_dst.uast | 472 ++ uast/diff/testdata/testcase_21_src.uast | 323 + uast/diff/testdata/testcase_22_dst.uast | 1996 +++++ uast/diff/testdata/testcase_22_src.uast | 33 + uast/diff/testdata/testcase_23_dst.uast | 342 + uast/diff/testdata/testcase_23_src.uast | 342 + uast/diff/testdata/testcase_24_dst.uast | 392 + uast/diff/testdata/testcase_24_src.uast | 325 + uast/diff/testdata/testcase_25_dst.uast | 325 + uast/diff/testdata/testcase_25_src.uast | 234 + uast/diff/testdata/testcase_26_dst.uast | 210 + uast/diff/testdata/testcase_26_src.uast | 210 + uast/diff/testdata/testcase_27_dst.uast | 210 + uast/diff/testdata/testcase_27_src.uast | 210 + uast/diff/testdata/testcase_28_dst.uast | 392 + uast/diff/testdata/testcase_28_src.uast | 392 + uast/diff/testdata/testcase_29_dst.uast | 210 + uast/diff/testdata/testcase_29_src.uast | 210 + uast/diff/testdata/testcase_2_dst.uast | 155 + uast/diff/testdata/testcase_2_src.uast | 154 + uast/diff/testdata/testcase_30_dst.uast | 757 ++ uast/diff/testdata/testcase_30_src.uast | 731 ++ uast/diff/testdata/testcase_31_dst.uast | 392 + uast/diff/testdata/testcase_31_src.uast | 325 + uast/diff/testdata/testcase_32_dst.uast | 392 + uast/diff/testdata/testcase_32_src.uast | 392 + uast/diff/testdata/testcase_33_dst.uast | 306 + uast/diff/testdata/testcase_33_src.uast | 273 + uast/diff/testdata/testcase_34_dst.uast | 419 ++ uast/diff/testdata/testcase_34_src.uast | 416 ++ uast/diff/testdata/testcase_35_dst.uast | 390 + uast/diff/testdata/testcase_35_src.uast | 419 ++ uast/diff/testdata/testcase_36_dst.uast | 255 + uast/diff/testdata/testcase_36_src.uast | 1088 +++ uast/diff/testdata/testcase_37_dst.uast | 589 ++ uast/diff/testdata/testcase_37_src.uast | 390 + uast/diff/testdata/testcase_38_dst.uast | 255 + uast/diff/testdata/testcase_38_src.uast | 255 + uast/diff/testdata/testcase_39_dst.uast | 272 + uast/diff/testdata/testcase_39_src.uast | 255 + uast/diff/testdata/testcase_3_dst.uast | 187 + uast/diff/testdata/testcase_3_src.uast | 3263 +++++++++ uast/diff/testdata/testcase_40_dst.uast | 419 ++ uast/diff/testdata/testcase_40_src.uast | 416 ++ uast/diff/testdata/testcase_41_dst.uast | 419 ++ uast/diff/testdata/testcase_41_src.uast | 419 ++ uast/diff/testdata/testcase_42_dst.uast | 682 ++ uast/diff/testdata/testcase_42_src.uast | 656 ++ uast/diff/testdata/testcase_43_dst.uast | 390 + uast/diff/testdata/testcase_43_src.uast | 419 ++ uast/diff/testdata/testcase_44_dst.uast | 997 +++ uast/diff/testdata/testcase_44_src.uast | 682 ++ uast/diff/testdata/testcase_45_dst.uast | 315 + uast/diff/testdata/testcase_45_src.uast | 307 + uast/diff/testdata/testcase_46_dst.uast | 339 + uast/diff/testdata/testcase_46_src.uast | 315 + uast/diff/testdata/testcase_47_dst.uast | 497 ++ uast/diff/testdata/testcase_47_src.uast | 1719 +++++ uast/diff/testdata/testcase_48_dst.uast | 497 ++ uast/diff/testdata/testcase_48_src.uast | 497 ++ uast/diff/testdata/testcase_49_dst.uast | 339 + uast/diff/testdata/testcase_49_src.uast | 315 + uast/diff/testdata/testcase_4_dst.uast | 317 + uast/diff/testdata/testcase_4_src.uast | 187 + uast/diff/testdata/testcase_50_dst.uast | 355 + uast/diff/testdata/testcase_50_src.uast | 339 + uast/diff/testdata/testcase_51_dst.uast | 363 + uast/diff/testdata/testcase_51_src.uast | 355 + uast/diff/testdata/testcase_52_dst.uast | 421 ++ uast/diff/testdata/testcase_52_src.uast | 363 + uast/diff/testdata/testcase_53_dst.uast | 720 ++ uast/diff/testdata/testcase_53_src.uast | 869 +++ uast/diff/testdata/testcase_54_dst.uast | 720 ++ uast/diff/testdata/testcase_54_src.uast | 720 ++ uast/diff/testdata/testcase_55_dst.uast | 869 +++ uast/diff/testdata/testcase_55_src.uast | 720 ++ uast/diff/testdata/testcase_56_dst.uast | 843 +++ uast/diff/testdata/testcase_56_src.uast | 1430 ++++ uast/diff/testdata/testcase_57_dst.uast | 306 + uast/diff/testdata/testcase_57_src.uast | 273 + uast/diff/testdata/testcase_58_dst.uast | 997 +++ uast/diff/testdata/testcase_58_src.uast | 682 ++ uast/diff/testdata/testcase_59_dst.uast | 992 +++ uast/diff/testdata/testcase_59_src.uast | 997 +++ uast/diff/testdata/testcase_5_dst.uast | 69 + uast/diff/testdata/testcase_5_src.uast | 69 + uast/diff/testdata/testcase_60_dst.uast | 992 +++ uast/diff/testdata/testcase_60_src.uast | 992 +++ uast/diff/testdata/testcase_61_dst.uast | 992 +++ uast/diff/testdata/testcase_61_src.uast | 992 +++ uast/diff/testdata/testcase_62_dst.uast | 869 +++ uast/diff/testdata/testcase_62_src.uast | 720 ++ uast/diff/testdata/testcase_63_dst.uast | 421 ++ uast/diff/testdata/testcase_63_src.uast | 363 + uast/diff/testdata/testcase_64_dst.uast | 456 ++ uast/diff/testdata/testcase_64_src.uast | 421 ++ uast/diff/testdata/testcase_65_dst.uast | 464 ++ uast/diff/testdata/testcase_65_src.uast | 456 ++ uast/diff/testdata/testcase_66_dst.uast | 992 +++ uast/diff/testdata/testcase_66_src.uast | 992 +++ uast/diff/testdata/testcase_67_dst.uast | 1315 ++++ uast/diff/testdata/testcase_67_src.uast | 992 +++ uast/diff/testdata/testcase_68_dst.uast | 350 + uast/diff/testdata/testcase_68_src.uast | 350 + uast/diff/testdata/testcase_69_dst.uast | 869 +++ uast/diff/testdata/testcase_69_src.uast | 869 +++ uast/diff/testdata/testcase_6_dst.uast | 398 + uast/diff/testdata/testcase_6_src.uast | 69 + uast/diff/testdata/testcase_70_dst.uast | 720 ++ uast/diff/testdata/testcase_70_src.uast | 869 +++ uast/diff/testdata/testcase_71_dst.uast | 350 + uast/diff/testdata/testcase_71_src.uast | 350 + uast/diff/testdata/testcase_72_dst.uast | 464 ++ uast/diff/testdata/testcase_72_src.uast | 456 ++ uast/diff/testdata/testcase_73_dst.uast | 472 ++ uast/diff/testdata/testcase_73_src.uast | 464 ++ uast/diff/testdata/testcase_74_dst.uast | 533 ++ uast/diff/testdata/testcase_74_src.uast | 472 ++ uast/diff/testdata/testcase_75_dst.uast | 350 + uast/diff/testdata/testcase_75_src.uast | 3684 ++++++++++ uast/diff/testdata/testcase_76_dst.uast | 1130 +++ uast/diff/testdata/testcase_76_src.uast | 897 +++ uast/diff/testdata/testcase_77_dst.uast | 1088 +++ uast/diff/testdata/testcase_77_src.uast | 1062 +++ uast/diff/testdata/testcase_78_dst.uast | 999 +++ uast/diff/testdata/testcase_78_src.uast | 1266 ++++ uast/diff/testdata/testcase_79_dst.uast | 533 ++ uast/diff/testdata/testcase_79_src.uast | 472 ++ uast/diff/testdata/testcase_7_dst.uast | 152 + uast/diff/testdata/testcase_7_src.uast | 152 + uast/diff/testdata/testcase_80_dst.uast | 562 ++ uast/diff/testdata/testcase_80_src.uast | 533 ++ uast/diff/testdata/testcase_81_dst.uast | 591 ++ uast/diff/testdata/testcase_81_src.uast | 562 ++ uast/diff/testdata/testcase_82_dst.uast | 607 ++ uast/diff/testdata/testcase_82_src.uast | 591 ++ uast/diff/testdata/testcase_83_dst.uast | 636 ++ uast/diff/testdata/testcase_83_src.uast | 607 ++ uast/diff/testdata/testcase_84_dst.uast | 1130 +++ uast/diff/testdata/testcase_84_src.uast | 897 +++ uast/diff/testdata/testcase_85_dst.uast | 1254 ++++ uast/diff/testdata/testcase_85_src.uast | 1130 +++ uast/diff/testdata/testcase_86_dst.uast | 636 ++ uast/diff/testdata/testcase_86_src.uast | 607 ++ uast/diff/testdata/testcase_87_dst.uast | 1254 ++++ uast/diff/testdata/testcase_87_src.uast | 1130 +++ uast/diff/testdata/testcase_88_dst.uast | 1262 ++++ uast/diff/testdata/testcase_88_src.uast | 1254 ++++ uast/diff/testdata/testcase_89_dst.uast | 681 ++ uast/diff/testdata/testcase_89_src.uast | 636 ++ uast/diff/testdata/testcase_8_dst.uast | 155 + uast/diff/testdata/testcase_8_src.uast | 154 + uast/diff/testdata/testcase_90_dst.uast | 1315 ++++ uast/diff/testdata/testcase_90_src.uast | 992 +++ uast/diff/testdata/testcase_91_dst.uast | 1681 +++++ uast/diff/testdata/testcase_91_src.uast | 1315 ++++ uast/diff/testdata/testcase_92_dst.uast | 1266 ++++ uast/diff/testdata/testcase_92_src.uast | 1295 ++++ uast/diff/testdata/testcase_93_dst.uast | 1266 ++++ uast/diff/testdata/testcase_93_src.uast | 1266 ++++ uast/diff/testdata/testcase_94_dst.uast | 999 +++ uast/diff/testdata/testcase_94_src.uast | 1266 ++++ uast/diff/testdata/testcase_95_dst.uast | 1262 ++++ uast/diff/testdata/testcase_95_src.uast | 1254 ++++ uast/diff/testdata/testcase_96_dst.uast | 1657 +++++ uast/diff/testdata/testcase_96_src.uast | 1262 ++++ uast/diff/testdata/testcase_97_dst.uast | 652 ++ uast/diff/testdata/testcase_97_src.uast | 681 ++ uast/diff/testdata/testcase_98_dst.uast | 683 ++ uast/diff/testdata/testcase_98_src.uast | 652 ++ uast/diff/testdata/testcase_99_dst.uast | 1128 +++ uast/diff/testdata/testcase_99_src.uast | 1128 +++ uast/diff/testdata/testcase_9_dst.uast | 152 + uast/diff/testdata/testcase_9_src.uast | 152 + 300 files changed, 239089 insertions(+) create mode 100644 uast/diff/changelist_test.go create mode 100644 uast/diff/testdata/config.txt create mode 100755 uast/diff/testdata/create_testdata.py create mode 100644 uast/diff/testdata/smalltest.txt create mode 100644 uast/diff/testdata/testcase_0_dst.uast create mode 100644 uast/diff/testdata/testcase_0_src.uast create mode 100644 uast/diff/testdata/testcase_100_dst.uast create mode 100644 uast/diff/testdata/testcase_100_src.uast create mode 100644 uast/diff/testdata/testcase_101_dst.uast create mode 100644 uast/diff/testdata/testcase_101_src.uast create mode 100644 uast/diff/testdata/testcase_102_dst.uast create mode 100644 uast/diff/testdata/testcase_102_src.uast create mode 100644 uast/diff/testdata/testcase_103_dst.uast create mode 100644 uast/diff/testdata/testcase_103_src.uast create mode 100644 uast/diff/testdata/testcase_104_dst.uast create mode 100644 uast/diff/testdata/testcase_104_src.uast create mode 100644 uast/diff/testdata/testcase_105_dst.uast create mode 100644 uast/diff/testdata/testcase_105_src.uast create mode 100644 uast/diff/testdata/testcase_106_dst.uast create mode 100644 uast/diff/testdata/testcase_106_src.uast create mode 100644 uast/diff/testdata/testcase_107_dst.uast create mode 100644 uast/diff/testdata/testcase_107_src.uast create mode 100644 uast/diff/testdata/testcase_108_dst.uast create mode 100644 uast/diff/testdata/testcase_108_src.uast create mode 100644 uast/diff/testdata/testcase_109_dst.uast create mode 100644 uast/diff/testdata/testcase_109_src.uast create mode 100644 uast/diff/testdata/testcase_10_dst.uast create mode 100644 uast/diff/testdata/testcase_10_src.uast create mode 100644 uast/diff/testdata/testcase_110_dst.uast create mode 100644 uast/diff/testdata/testcase_110_src.uast create mode 100644 uast/diff/testdata/testcase_111_dst.uast create mode 100644 uast/diff/testdata/testcase_111_src.uast create mode 100644 uast/diff/testdata/testcase_112_dst.uast create mode 100644 uast/diff/testdata/testcase_112_src.uast create mode 100644 uast/diff/testdata/testcase_113_dst.uast create mode 100644 uast/diff/testdata/testcase_113_src.uast create mode 100644 uast/diff/testdata/testcase_114_dst.uast create mode 100644 uast/diff/testdata/testcase_114_src.uast create mode 100644 uast/diff/testdata/testcase_115_dst.uast create mode 100644 uast/diff/testdata/testcase_115_src.uast create mode 100644 uast/diff/testdata/testcase_116_dst.uast create mode 100644 uast/diff/testdata/testcase_116_src.uast create mode 100644 uast/diff/testdata/testcase_117_dst.uast create mode 100644 uast/diff/testdata/testcase_117_src.uast create mode 100644 uast/diff/testdata/testcase_118_dst.uast create mode 100644 uast/diff/testdata/testcase_118_src.uast create mode 100644 uast/diff/testdata/testcase_119_dst.uast create mode 100644 uast/diff/testdata/testcase_119_src.uast create mode 100644 uast/diff/testdata/testcase_11_dst.uast create mode 100644 uast/diff/testdata/testcase_11_src.uast create mode 100644 uast/diff/testdata/testcase_120_dst.uast create mode 100644 uast/diff/testdata/testcase_120_src.uast create mode 100644 uast/diff/testdata/testcase_121_dst.uast create mode 100644 uast/diff/testdata/testcase_121_src.uast create mode 100644 uast/diff/testdata/testcase_122_dst.uast create mode 100644 uast/diff/testdata/testcase_122_src.uast create mode 100644 uast/diff/testdata/testcase_123_dst.uast create mode 100644 uast/diff/testdata/testcase_123_src.uast create mode 100644 uast/diff/testdata/testcase_124_dst.uast create mode 100644 uast/diff/testdata/testcase_124_src.uast create mode 100644 uast/diff/testdata/testcase_125_dst.uast create mode 100644 uast/diff/testdata/testcase_125_src.uast create mode 100644 uast/diff/testdata/testcase_126_dst.uast create mode 100644 uast/diff/testdata/testcase_126_src.uast create mode 100644 uast/diff/testdata/testcase_127_dst.uast create mode 100644 uast/diff/testdata/testcase_127_src.uast create mode 100644 uast/diff/testdata/testcase_128_dst.uast create mode 100644 uast/diff/testdata/testcase_128_src.uast create mode 100644 uast/diff/testdata/testcase_129_dst.uast create mode 100644 uast/diff/testdata/testcase_129_src.uast create mode 100644 uast/diff/testdata/testcase_12_dst.uast create mode 100644 uast/diff/testdata/testcase_12_src.uast create mode 100644 uast/diff/testdata/testcase_130_dst.uast create mode 100644 uast/diff/testdata/testcase_130_src.uast create mode 100644 uast/diff/testdata/testcase_131_dst.uast create mode 100644 uast/diff/testdata/testcase_131_src.uast create mode 100644 uast/diff/testdata/testcase_132_dst.uast create mode 100644 uast/diff/testdata/testcase_132_src.uast create mode 100644 uast/diff/testdata/testcase_133_dst.uast create mode 100644 uast/diff/testdata/testcase_133_src.uast create mode 100644 uast/diff/testdata/testcase_134_dst.uast create mode 100644 uast/diff/testdata/testcase_134_src.uast create mode 100644 uast/diff/testdata/testcase_135_dst.uast create mode 100644 uast/diff/testdata/testcase_135_src.uast create mode 100644 uast/diff/testdata/testcase_136_dst.uast create mode 100644 uast/diff/testdata/testcase_136_src.uast create mode 100644 uast/diff/testdata/testcase_137_dst.uast create mode 100644 uast/diff/testdata/testcase_137_src.uast create mode 100644 uast/diff/testdata/testcase_138_dst.uast create mode 100644 uast/diff/testdata/testcase_138_src.uast create mode 100644 uast/diff/testdata/testcase_139_dst.uast create mode 100644 uast/diff/testdata/testcase_139_src.uast create mode 100644 uast/diff/testdata/testcase_13_dst.uast create mode 100644 uast/diff/testdata/testcase_13_src.uast create mode 100644 uast/diff/testdata/testcase_140_dst.uast create mode 100644 uast/diff/testdata/testcase_140_src.uast create mode 100644 uast/diff/testdata/testcase_141_dst.uast create mode 100644 uast/diff/testdata/testcase_141_src.uast create mode 100644 uast/diff/testdata/testcase_142_dst.uast create mode 100644 uast/diff/testdata/testcase_142_src.uast create mode 100644 uast/diff/testdata/testcase_143_dst.uast create mode 100644 uast/diff/testdata/testcase_143_src.uast create mode 100644 uast/diff/testdata/testcase_144_dst.uast create mode 100644 uast/diff/testdata/testcase_144_src.uast create mode 100644 uast/diff/testdata/testcase_145_dst.uast create mode 100644 uast/diff/testdata/testcase_145_src.uast create mode 100644 uast/diff/testdata/testcase_146_dst.uast create mode 100644 uast/diff/testdata/testcase_146_src.uast create mode 100644 uast/diff/testdata/testcase_147_dst.uast create mode 100644 uast/diff/testdata/testcase_147_src.uast create mode 100644 uast/diff/testdata/testcase_14_dst.uast create mode 100644 uast/diff/testdata/testcase_14_src.uast create mode 100644 uast/diff/testdata/testcase_15_dst.uast create mode 100644 uast/diff/testdata/testcase_15_src.uast create mode 100644 uast/diff/testdata/testcase_16_dst.uast create mode 100644 uast/diff/testdata/testcase_16_src.uast create mode 100644 uast/diff/testdata/testcase_17_dst.uast create mode 100644 uast/diff/testdata/testcase_17_src.uast create mode 100644 uast/diff/testdata/testcase_18_dst.uast create mode 100644 uast/diff/testdata/testcase_18_src.uast create mode 100644 uast/diff/testdata/testcase_19_dst.uast create mode 100644 uast/diff/testdata/testcase_19_src.uast create mode 100644 uast/diff/testdata/testcase_1_dst.uast create mode 100644 uast/diff/testdata/testcase_1_src.uast create mode 100644 uast/diff/testdata/testcase_20_dst.uast create mode 100644 uast/diff/testdata/testcase_20_src.uast create mode 100644 uast/diff/testdata/testcase_21_dst.uast create mode 100644 uast/diff/testdata/testcase_21_src.uast create mode 100644 uast/diff/testdata/testcase_22_dst.uast create mode 100644 uast/diff/testdata/testcase_22_src.uast create mode 100644 uast/diff/testdata/testcase_23_dst.uast create mode 100644 uast/diff/testdata/testcase_23_src.uast create mode 100644 uast/diff/testdata/testcase_24_dst.uast create mode 100644 uast/diff/testdata/testcase_24_src.uast create mode 100644 uast/diff/testdata/testcase_25_dst.uast create mode 100644 uast/diff/testdata/testcase_25_src.uast create mode 100644 uast/diff/testdata/testcase_26_dst.uast create mode 100644 uast/diff/testdata/testcase_26_src.uast create mode 100644 uast/diff/testdata/testcase_27_dst.uast create mode 100644 uast/diff/testdata/testcase_27_src.uast create mode 100644 uast/diff/testdata/testcase_28_dst.uast create mode 100644 uast/diff/testdata/testcase_28_src.uast create mode 100644 uast/diff/testdata/testcase_29_dst.uast create mode 100644 uast/diff/testdata/testcase_29_src.uast create mode 100644 uast/diff/testdata/testcase_2_dst.uast create mode 100644 uast/diff/testdata/testcase_2_src.uast create mode 100644 uast/diff/testdata/testcase_30_dst.uast create mode 100644 uast/diff/testdata/testcase_30_src.uast create mode 100644 uast/diff/testdata/testcase_31_dst.uast create mode 100644 uast/diff/testdata/testcase_31_src.uast create mode 100644 uast/diff/testdata/testcase_32_dst.uast create mode 100644 uast/diff/testdata/testcase_32_src.uast create mode 100644 uast/diff/testdata/testcase_33_dst.uast create mode 100644 uast/diff/testdata/testcase_33_src.uast create mode 100644 uast/diff/testdata/testcase_34_dst.uast create mode 100644 uast/diff/testdata/testcase_34_src.uast create mode 100644 uast/diff/testdata/testcase_35_dst.uast create mode 100644 uast/diff/testdata/testcase_35_src.uast create mode 100644 uast/diff/testdata/testcase_36_dst.uast create mode 100644 uast/diff/testdata/testcase_36_src.uast create mode 100644 uast/diff/testdata/testcase_37_dst.uast create mode 100644 uast/diff/testdata/testcase_37_src.uast create mode 100644 uast/diff/testdata/testcase_38_dst.uast create mode 100644 uast/diff/testdata/testcase_38_src.uast create mode 100644 uast/diff/testdata/testcase_39_dst.uast create mode 100644 uast/diff/testdata/testcase_39_src.uast create mode 100644 uast/diff/testdata/testcase_3_dst.uast create mode 100644 uast/diff/testdata/testcase_3_src.uast create mode 100644 uast/diff/testdata/testcase_40_dst.uast create mode 100644 uast/diff/testdata/testcase_40_src.uast create mode 100644 uast/diff/testdata/testcase_41_dst.uast create mode 100644 uast/diff/testdata/testcase_41_src.uast create mode 100644 uast/diff/testdata/testcase_42_dst.uast create mode 100644 uast/diff/testdata/testcase_42_src.uast create mode 100644 uast/diff/testdata/testcase_43_dst.uast create mode 100644 uast/diff/testdata/testcase_43_src.uast create mode 100644 uast/diff/testdata/testcase_44_dst.uast create mode 100644 uast/diff/testdata/testcase_44_src.uast create mode 100644 uast/diff/testdata/testcase_45_dst.uast create mode 100644 uast/diff/testdata/testcase_45_src.uast create mode 100644 uast/diff/testdata/testcase_46_dst.uast create mode 100644 uast/diff/testdata/testcase_46_src.uast create mode 100644 uast/diff/testdata/testcase_47_dst.uast create mode 100644 uast/diff/testdata/testcase_47_src.uast create mode 100644 uast/diff/testdata/testcase_48_dst.uast create mode 100644 uast/diff/testdata/testcase_48_src.uast create mode 100644 uast/diff/testdata/testcase_49_dst.uast create mode 100644 uast/diff/testdata/testcase_49_src.uast create mode 100644 uast/diff/testdata/testcase_4_dst.uast create mode 100644 uast/diff/testdata/testcase_4_src.uast create mode 100644 uast/diff/testdata/testcase_50_dst.uast create mode 100644 uast/diff/testdata/testcase_50_src.uast create mode 100644 uast/diff/testdata/testcase_51_dst.uast create mode 100644 uast/diff/testdata/testcase_51_src.uast create mode 100644 uast/diff/testdata/testcase_52_dst.uast create mode 100644 uast/diff/testdata/testcase_52_src.uast create mode 100644 uast/diff/testdata/testcase_53_dst.uast create mode 100644 uast/diff/testdata/testcase_53_src.uast create mode 100644 uast/diff/testdata/testcase_54_dst.uast create mode 100644 uast/diff/testdata/testcase_54_src.uast create mode 100644 uast/diff/testdata/testcase_55_dst.uast create mode 100644 uast/diff/testdata/testcase_55_src.uast create mode 100644 uast/diff/testdata/testcase_56_dst.uast create mode 100644 uast/diff/testdata/testcase_56_src.uast create mode 100644 uast/diff/testdata/testcase_57_dst.uast create mode 100644 uast/diff/testdata/testcase_57_src.uast create mode 100644 uast/diff/testdata/testcase_58_dst.uast create mode 100644 uast/diff/testdata/testcase_58_src.uast create mode 100644 uast/diff/testdata/testcase_59_dst.uast create mode 100644 uast/diff/testdata/testcase_59_src.uast create mode 100644 uast/diff/testdata/testcase_5_dst.uast create mode 100644 uast/diff/testdata/testcase_5_src.uast create mode 100644 uast/diff/testdata/testcase_60_dst.uast create mode 100644 uast/diff/testdata/testcase_60_src.uast create mode 100644 uast/diff/testdata/testcase_61_dst.uast create mode 100644 uast/diff/testdata/testcase_61_src.uast create mode 100644 uast/diff/testdata/testcase_62_dst.uast create mode 100644 uast/diff/testdata/testcase_62_src.uast create mode 100644 uast/diff/testdata/testcase_63_dst.uast create mode 100644 uast/diff/testdata/testcase_63_src.uast create mode 100644 uast/diff/testdata/testcase_64_dst.uast create mode 100644 uast/diff/testdata/testcase_64_src.uast create mode 100644 uast/diff/testdata/testcase_65_dst.uast create mode 100644 uast/diff/testdata/testcase_65_src.uast create mode 100644 uast/diff/testdata/testcase_66_dst.uast create mode 100644 uast/diff/testdata/testcase_66_src.uast create mode 100644 uast/diff/testdata/testcase_67_dst.uast create mode 100644 uast/diff/testdata/testcase_67_src.uast create mode 100644 uast/diff/testdata/testcase_68_dst.uast create mode 100644 uast/diff/testdata/testcase_68_src.uast create mode 100644 uast/diff/testdata/testcase_69_dst.uast create mode 100644 uast/diff/testdata/testcase_69_src.uast create mode 100644 uast/diff/testdata/testcase_6_dst.uast create mode 100644 uast/diff/testdata/testcase_6_src.uast create mode 100644 uast/diff/testdata/testcase_70_dst.uast create mode 100644 uast/diff/testdata/testcase_70_src.uast create mode 100644 uast/diff/testdata/testcase_71_dst.uast create mode 100644 uast/diff/testdata/testcase_71_src.uast create mode 100644 uast/diff/testdata/testcase_72_dst.uast create mode 100644 uast/diff/testdata/testcase_72_src.uast create mode 100644 uast/diff/testdata/testcase_73_dst.uast create mode 100644 uast/diff/testdata/testcase_73_src.uast create mode 100644 uast/diff/testdata/testcase_74_dst.uast create mode 100644 uast/diff/testdata/testcase_74_src.uast create mode 100644 uast/diff/testdata/testcase_75_dst.uast create mode 100644 uast/diff/testdata/testcase_75_src.uast create mode 100644 uast/diff/testdata/testcase_76_dst.uast create mode 100644 uast/diff/testdata/testcase_76_src.uast create mode 100644 uast/diff/testdata/testcase_77_dst.uast create mode 100644 uast/diff/testdata/testcase_77_src.uast create mode 100644 uast/diff/testdata/testcase_78_dst.uast create mode 100644 uast/diff/testdata/testcase_78_src.uast create mode 100644 uast/diff/testdata/testcase_79_dst.uast create mode 100644 uast/diff/testdata/testcase_79_src.uast create mode 100644 uast/diff/testdata/testcase_7_dst.uast create mode 100644 uast/diff/testdata/testcase_7_src.uast create mode 100644 uast/diff/testdata/testcase_80_dst.uast create mode 100644 uast/diff/testdata/testcase_80_src.uast create mode 100644 uast/diff/testdata/testcase_81_dst.uast create mode 100644 uast/diff/testdata/testcase_81_src.uast create mode 100644 uast/diff/testdata/testcase_82_dst.uast create mode 100644 uast/diff/testdata/testcase_82_src.uast create mode 100644 uast/diff/testdata/testcase_83_dst.uast create mode 100644 uast/diff/testdata/testcase_83_src.uast create mode 100644 uast/diff/testdata/testcase_84_dst.uast create mode 100644 uast/diff/testdata/testcase_84_src.uast create mode 100644 uast/diff/testdata/testcase_85_dst.uast create mode 100644 uast/diff/testdata/testcase_85_src.uast create mode 100644 uast/diff/testdata/testcase_86_dst.uast create mode 100644 uast/diff/testdata/testcase_86_src.uast create mode 100644 uast/diff/testdata/testcase_87_dst.uast create mode 100644 uast/diff/testdata/testcase_87_src.uast create mode 100644 uast/diff/testdata/testcase_88_dst.uast create mode 100644 uast/diff/testdata/testcase_88_src.uast create mode 100644 uast/diff/testdata/testcase_89_dst.uast create mode 100644 uast/diff/testdata/testcase_89_src.uast create mode 100644 uast/diff/testdata/testcase_8_dst.uast create mode 100644 uast/diff/testdata/testcase_8_src.uast create mode 100644 uast/diff/testdata/testcase_90_dst.uast create mode 100644 uast/diff/testdata/testcase_90_src.uast create mode 100644 uast/diff/testdata/testcase_91_dst.uast create mode 100644 uast/diff/testdata/testcase_91_src.uast create mode 100644 uast/diff/testdata/testcase_92_dst.uast create mode 100644 uast/diff/testdata/testcase_92_src.uast create mode 100644 uast/diff/testdata/testcase_93_dst.uast create mode 100644 uast/diff/testdata/testcase_93_src.uast create mode 100644 uast/diff/testdata/testcase_94_dst.uast create mode 100644 uast/diff/testdata/testcase_94_src.uast create mode 100644 uast/diff/testdata/testcase_95_dst.uast create mode 100644 uast/diff/testdata/testcase_95_src.uast create mode 100644 uast/diff/testdata/testcase_96_dst.uast create mode 100644 uast/diff/testdata/testcase_96_src.uast create mode 100644 uast/diff/testdata/testcase_97_dst.uast create mode 100644 uast/diff/testdata/testcase_97_src.uast create mode 100644 uast/diff/testdata/testcase_98_dst.uast create mode 100644 uast/diff/testdata/testcase_98_src.uast create mode 100644 uast/diff/testdata/testcase_99_dst.uast create mode 100644 uast/diff/testdata/testcase_99_src.uast create mode 100644 uast/diff/testdata/testcase_9_dst.uast create mode 100644 uast/diff/testdata/testcase_9_src.uast diff --git a/uast/diff/changelist_test.go b/uast/diff/changelist_test.go new file mode 100644 index 00000000..6b5a9b67 --- /dev/null +++ b/uast/diff/changelist_test.go @@ -0,0 +1,44 @@ +package diff + +import ( + "fmt" + "os" + "io/ioutil" + "testing" + "gopkg.in/bblfsh/sdk.v2/uast/yaml" + "gopkg.in/bblfsh/sdk.v2/uast/nodes" + "github.com/stretchr/testify/require" +) + + +const dataDir = "./testdata" + +func readUAST(t testing.TB, path string) nodes.Node { + data, err := ioutil.ReadFile(path) + require.NoError(t, err) + nd, err := uastyml.Unmarshal(data) + require.NoError(t, err) + return nd +} + +func TestChangelist(t *testing.T) { + fd, err := os.Open(fmt.Sprintf("%v/config.txt", dataDir)) + require.NoError(t, err) + var n int + _, err = fmt.Fscanf(fd, "%d\n", &n) + require.NoError(t, err) + + for i := 0; i < n; i++ { + name := fmt.Sprintf("%v/testcase_%v", dataDir, i) + t.Run(name, func(t *testing.T) { + src_name := fmt.Sprintf("%v_src.uast", name) + dst_name := fmt.Sprintf("%v_dst.uast", name) + src := readUAST(t, src_name) + dst := readUAST(t, dst_name) + + changes := Changes(src, dst) + newsrc := Apply(src, changes) + require.True(t, nodes.Equal(newsrc, dst)) + }) + } +} diff --git a/uast/diff/testdata/config.txt b/uast/diff/testdata/config.txt new file mode 100644 index 00000000..0d667b5e --- /dev/null +++ b/uast/diff/testdata/config.txt @@ -0,0 +1 @@ +148 diff --git a/uast/diff/testdata/create_testdata.py b/uast/diff/testdata/create_testdata.py new file mode 100755 index 00000000..89ee5f06 --- /dev/null +++ b/uast/diff/testdata/create_testdata.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python3 + +# This is a python script used to generate test data for the diff library. It uses pairs of files +# to get diffed acquired from +# https://github.com/vmarkovtsev/treediff/blob/49356e7f85c261ed88cf46326791765c58c22b5b/dataset/flask.tar.xz +# It uses https://github.com/bblfsh/client-go#Installation to convert python sources into +# uast binary files. +# It needs to be configured with proper DATASET_PATH which is a path to an unpacked +# flask.tar.xz file. + +import os +from glob import glob + + +DATASET_PATH = "~/data/sourced/treediff/python-dataset" +pwd = os.path.expanduser(DATASET_PATH) + +testnames = [e for e in open("smalltest.txt", "r").read().split() if e] + + +def get_src(name): + return glob("{}/{}_before*.src".format(pwd, name))[0] + + +def get_dst(name): + return glob("{}/{}_after*.src".format(pwd, name))[0] + +i = 0 +for src, dst in ((get_src(name), get_dst(name)) for name in testnames): + print(i, src) + os.system("bblfsh-cli -l python {} -o yaml > testcase_{}_src.uast".format(src, i)) + os.system("bblfsh-cli -l python {} -o yaml > testcase_{}_dst.uast".format(dst, i)) + i += 1 + +# number of testcases +open("config.txt", "w").write("{}\n".format(i)) diff --git a/uast/diff/testdata/smalltest.txt b/uast/diff/testdata/smalltest.txt new file mode 100644 index 00000000..c92d3c74 --- /dev/null +++ b/uast/diff/testdata/smalltest.txt @@ -0,0 +1,148 @@ +720_1 +721_0 +1360_2 +712_1 +714_1 +721_0 +763_2 +1233_19 +1360_2 +702_18 +763_2 +714_1 +720_1 +1154_0 +1195_0 +296_3 +640_2 +1233_21 +640_4 +447_3 +1154_0 +1195_0 +1249_1 +1233_22 +640_3 +447_3 +1144_0 +1172_0 +1233_23 +1281_8 +1403_2 +640_3 +702_3 +1353_6 +16_2 +36_0 +618_5 +62_0 +730_8 +781_1 +16_2 +17_1 +296_3 +36_0 +442_2 +294_0 +296_0 +1009_27 +1095_28 +296_0 +297_1 +303_0 +311_0 +1154_2 +1281_4 +1346_72 +1391_5 +1353_6 +442_2 +638_3 +730_4 +765_2 +1346_72 +311_0 +313_0 +319_0 +765_2 +865_2 +1095_12 +1095_2 +1154_2 +1281_16 +319_0 +357_2 +360_4 +776_0 +551_1 +296_6 +1408_8 +360_4 +376_0 +520_2 +530_18 +535_0 +551_1 +555_1 +535_0 +555_1 +556_2 +575_2 +865_2 +961_5 +1240_3 +1281_44 +1408_8 +556_2 +579_2 +618_2 +623_1 +1095_29 +1240_3 +575_2 +578_0 +593_0 +594_0 +605_0 +613_0 +618_2 +705_3 +706_3 +731_6 +867_2 +1346_102 +1391_5 +322_0 +623_1 +638_0 +1009_27 +638_0 +730_0 +731_6 +779_0 +780_1 +867_0 +1095_18 +334_2 +530_23 +560_3 +730_7 +867_0 +877_2 +904_2 +296_6 +334_4 +530_23 +531_3 +560_3 +618_5 +730_6 +788_1 +904_2 +909_3 +1095_14 +322_0 +323_1 +909_3 +910_1 +915_9 diff --git a/uast/diff/testdata/testcase_0_dst.uast b/uast/diff/testdata/testcase_0_dst.uast new file mode 100644 index 00000000..ba157e75 --- /dev/null +++ b/uast/diff/testdata/testcase_0_dst.uast @@ -0,0 +1,69 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "main", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.testsuite", + }, + Target: ~, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 33, + line: 2, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 33, + line: 2, + col: 1, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 33, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 37, + line: 2, + col: 5, + }, + }, + Name: "main", + }, + keywords: [], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_0_src.uast b/uast/diff/testdata/testcase_0_src.uast new file mode 100644 index 00000000..99e9c673 --- /dev/null +++ b/uast/diff/testdata/testcase_0_src.uast @@ -0,0 +1,317 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "unittest", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 16, + line: 2, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "BetterLoader", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.testsuite", + }, + Target: ~, + }, + { '@type': "TryExcept", + '@role': [Catch, Statement, Try], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 3, + col: 1, + }, + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 66, + line: 4, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 66, + line: 4, + col: 5, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 67, + line: 4, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 75, + line: 4, + col: 14, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 66, + line: 4, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 74, + line: 4, + col: 13, + }, + }, + Name: "unittest", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 66, + line: 4, + col: 5, + }, + }, + Name: "main", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "testLoader", + }, + value: { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 91, + line: 4, + col: 30, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 91, + line: 4, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 103, + line: 4, + col: 42, + }, + }, + Name: "BetterLoader", + }, + keywords: [], + kwargs: ~, + starargs: ~, + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "defaultTest", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 119, + line: 4, + col: 58, + }, + end: { '@type': "uast:Position", + offset: 126, + line: 4, + col: 65, + }, + }, + Format: "", + Value: "suite", + }, + }, + ], + kwargs: ~, + starargs: ~, + }, + }, + ], + handlers: [ + { '@type': "ExceptHandler", + '@role': [Catch, Identifier, Try], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 128, + line: 5, + col: 1, + }, + }, + '@token': { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 146, + line: 5, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 147, + line: 5, + col: 20, + }, + }, + Name: "e", + }, + body: [ + { '@type': "Print", + '@token': "print", + '@role': [Call, Callee, Expression, Function, Identifier], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 153, + line: 6, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 158, + line: 6, + col: 10, + }, + }, + dest: ~, + nl: true, + values: [ + { '@type': "BinOp", + '@role': [Argument, Binary, Call, Expression, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 159, + line: 6, + col: 11, + }, + }, + left: { '@type': "uast:String", + '@role': [Binary, Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 159, + line: 6, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 170, + line: 6, + col: 22, + }, + }, + Format: "", + Value: "Error: %s", + }, + op: { '@type': "Mod", + '@token': "%", + '@role': [Arithmetic, Binary, Module, Operator], + '@pos': { '@type': "uast:Positions", + }, + }, + right: { '@type': "uast:Identifier", + '@role': [Binary, Expression, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 173, + line: 6, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 174, + line: 6, + col: 26, + }, + }, + Name: "e", + }, + }, + ], + }, + ], + type: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 135, + line: 5, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 144, + line: 5, + col: 17, + }, + }, + Name: "Exception", + }, + }, + ], + orelse: [], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_100_dst.uast b/uast/diff/testdata/testcase_100_dst.uast new file mode 100644 index 00000000..be41e849 --- /dev/null +++ b/uast/diff/testdata/testcase_100_dst.uast @@ -0,0 +1,1266 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 244, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 247, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n tests.subclassing\n ~~~~~~~~~~~~~~~~~\n\n Test that certain behavior of flask can be customized by\n subclasses.\n\n :copyright: (c) 2014 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 248, + line: 12, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flask", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 261, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 273, + line: 13, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "StreamHandler", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "logging", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 296, + line: 15, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "StringIO", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask._compat", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 337, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 370, + line: 18, + col: 38, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "test_suppressed_exception_logging", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "ClassDef", + '@token': "SuppressedFlask", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 384, + line: 19, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 399, + line: 19, + col: 26, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 401, + line: 19, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 406, + line: 19, + col: 33, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 400, + line: 19, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 405, + line: 19, + col: 32, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 400, + line: 19, + col: 27, + }, + }, + Name: "Flask", + }, + ], + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 426, + line: 20, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 439, + line: 20, + col: 26, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "log_exception", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Pass", + '@token': "pass", + '@role': [Noop, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 469, + line: 21, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 473, + line: 21, + col: 17, + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 440, + line: 20, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 444, + line: 20, + col: 31, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 440, + line: 20, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 444, + line: 20, + col: 31, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 20, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 454, + line: 20, + col: 41, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 20, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 454, + line: 20, + col: 41, + }, + }, + Name: "exc_info", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 479, + line: 23, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 479, + line: 23, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 482, + line: 23, + col: 8, + }, + }, + Name: "out", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 485, + line: 23, + col: 11, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 485, + line: 23, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 493, + line: 23, + col: 19, + }, + }, + Name: "StringIO", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 500, + line: 24, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 500, + line: 24, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 503, + line: 24, + col: 8, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 506, + line: 24, + col: 11, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 522, + line: 24, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 530, + line: 24, + col: 35, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 506, + line: 24, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 521, + line: 24, + col: 26, + }, + }, + Name: "SuppressedFlask", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 536, + line: 25, + col: 5, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 537, + line: 25, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 540, + line: 25, + col: 9, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 536, + line: 25, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 539, + line: 25, + col: 8, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 536, + line: 25, + col: 5, + }, + }, + Name: "logger_name", + }, + ], + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 554, + line: 25, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 601, + line: 25, + col: 70, + }, + }, + Format: "", + Value: "flask_tests/test_suppressed_exception_logging", + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 606, + line: 26, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 606, + line: 26, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 628, + line: 26, + col: 27, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 642, + line: 26, + col: 41, + }, + end: { '@type': "uast:Position", + offset: 645, + line: 26, + col: 44, + }, + }, + Name: "out", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 628, + line: 26, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 641, + line: 26, + col: 40, + }, + }, + Name: "StreamHandler", + }, + keywords: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 607, + line: 26, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 610, + line: 26, + col: 9, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 606, + line: 26, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 609, + line: 26, + col: 8, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 610, + line: 26, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 616, + line: 26, + col: 15, + }, + }, + Name: "logger", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 606, + line: 26, + col: 5, + }, + }, + Name: "addHandler", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 653, + line: 28, + col: 5, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 694, + line: 30, + col: 9, + }, + }, + value: { '@type': "BinOp", + '@role': [Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 694, + line: 30, + col: 9, + }, + }, + left: { '@type': "Num", + '@token': 1, + '@role': [Binary, Expression, Left, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 694, + line: 30, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 695, + line: 30, + col: 10, + }, + }, + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 648, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 648, + line: 27, + col: 1, + }, + }, + lines: [], + }, + }, + op: { '@type': "FloorDiv", + '@token': "//", + '@role': [Arithmetic, Binary, Divide, Incomplete, Operator], + '@pos': { '@type': "uast:Positions", + }, + }, + right: { '@type': "Num", + '@token': 0, + '@role': [Binary, Expression, Literal, Number, Primitive, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 699, + line: 30, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 700, + line: 30, + col: 15, + }, + }, + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 706, + line: 32, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 706, + line: 32, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 708, + line: 32, + col: 7, + }, + }, + Name: "rv", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 711, + line: 32, + col: 10, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 733, + line: 32, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 736, + line: 32, + col: 35, + }, + }, + Format: "", + Value: "/", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 712, + line: 32, + col: 11, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 711, + line: 32, + col: 10, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 712, + line: 32, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 715, + line: 32, + col: 14, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 711, + line: 32, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 714, + line: 32, + col: 13, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 711, + line: 32, + col: 10, + }, + }, + Name: "test_client", + }, + ], + }, + keywords: [], + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 711, + line: 32, + col: 10, + }, + }, + Name: "get", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 742, + line: 33, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 748, + line: 33, + col: 11, + }, + }, + msg: ~, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 749, + line: 33, + col: 12, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "Num", + '@token': 500, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 767, + line: 33, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 770, + line: 33, + col: 33, + }, + }, + }, + ], + }, + left: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 750, + line: 33, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 752, + line: 33, + col: 15, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 749, + line: 33, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 751, + line: 33, + col: 14, + }, + }, + Name: "rv", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 749, + line: 33, + col: 12, + }, + }, + Name: "status_code", + }, + ], + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 775, + line: 34, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 781, + line: 34, + col: 11, + }, + }, + msg: ~, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 782, + line: 34, + col: 12, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 811, + line: 34, + col: 41, + }, + end: { '@type': "uast:Position", + offset: 813, + line: 34, + col: 43, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 810, + line: 34, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 812, + line: 34, + col: 42, + }, + }, + Name: "rv", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 810, + line: 34, + col: 40, + }, + }, + Name: "data", + }, + ], + }, + ], + }, + left: { '@type': "uast:String", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 782, + line: 34, + col: 12, + }, + }, + Format: "", + Value: "Internal Server Error", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "In", + '@token': "in", + '@role': [Contains, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 823, + line: 36, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 823, + line: 36, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 826, + line: 36, + col: 8, + }, + }, + Name: "err", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 829, + line: 36, + col: 11, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 830, + line: 36, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 833, + line: 36, + col: 15, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 829, + line: 36, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 832, + line: 36, + col: 14, + }, + }, + Name: "out", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 829, + line: 36, + col: 11, + }, + }, + Name: "getvalue", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 848, + line: 37, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 854, + line: 37, + col: 11, + }, + }, + msg: ~, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 855, + line: 37, + col: 12, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 862, + line: 37, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 864, + line: 37, + col: 21, + }, + }, + Format: "", + Value: "", + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 855, + line: 37, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 858, + line: 37, + col: 15, + }, + }, + Name: "err", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_100_src.uast b/uast/diff/testdata/testcase_100_src.uast new file mode 100644 index 00000000..fba81615 --- /dev/null +++ b/uast/diff/testdata/testcase_100_src.uast @@ -0,0 +1,1295 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 254, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 257, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n tests.subclassing\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n Test that certain behavior of flask can be customized by\n subclasses.\n\n :copyright: (c) 2014 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 258, + line: 12, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flask", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 13, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "unittest", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 287, + line: 14, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 299, + line: 14, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "StreamHandler", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "logging", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 322, + line: 16, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "StringIO", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask._compat", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 363, + line: 19, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 396, + line: 19, + col: 38, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "test_suppressed_exception_logging", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "ClassDef", + '@token': "SuppressedFlask", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 410, + line: 20, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 425, + line: 20, + col: 26, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 427, + line: 20, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 432, + line: 20, + col: 33, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 426, + line: 20, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 431, + line: 20, + col: 32, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 426, + line: 20, + col: 27, + }, + }, + Name: "Flask", + }, + ], + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 452, + line: 21, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 465, + line: 21, + col: 26, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "log_exception", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Pass", + '@token': "pass", + '@role': [Noop, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 495, + line: 22, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 499, + line: 22, + col: 17, + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 466, + line: 21, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 470, + line: 21, + col: 31, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 466, + line: 21, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 470, + line: 21, + col: 31, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 472, + line: 21, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 480, + line: 21, + col: 41, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 472, + line: 21, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 480, + line: 21, + col: 41, + }, + }, + Name: "exc_info", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 505, + line: 24, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 505, + line: 24, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 508, + line: 24, + col: 8, + }, + }, + Name: "out", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 511, + line: 24, + col: 11, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 511, + line: 24, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 519, + line: 24, + col: 19, + }, + }, + Name: "StringIO", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 526, + line: 25, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 526, + line: 25, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 529, + line: 25, + col: 8, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 532, + line: 25, + col: 11, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 548, + line: 25, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 556, + line: 25, + col: 35, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 532, + line: 25, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 547, + line: 25, + col: 26, + }, + }, + Name: "SuppressedFlask", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 562, + line: 26, + col: 5, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 563, + line: 26, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 566, + line: 26, + col: 9, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 562, + line: 26, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 565, + line: 26, + col: 8, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 562, + line: 26, + col: 5, + }, + }, + Name: "logger_name", + }, + ], + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 580, + line: 26, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 627, + line: 26, + col: 70, + }, + }, + Format: "", + Value: "flask_tests/test_suppressed_exception_logging", + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 632, + line: 27, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 632, + line: 27, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 654, + line: 27, + col: 27, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 668, + line: 27, + col: 41, + }, + end: { '@type': "uast:Position", + offset: 671, + line: 27, + col: 44, + }, + }, + Name: "out", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 654, + line: 27, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 667, + line: 27, + col: 40, + }, + }, + Name: "StreamHandler", + }, + keywords: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 633, + line: 27, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 636, + line: 27, + col: 9, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 632, + line: 27, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 635, + line: 27, + col: 8, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 636, + line: 27, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 642, + line: 27, + col: 15, + }, + }, + Name: "logger", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 632, + line: 27, + col: 5, + }, + }, + Name: "addHandler", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 679, + line: 29, + col: 5, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 720, + line: 31, + col: 9, + }, + }, + value: { '@type': "BinOp", + '@role': [Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 720, + line: 31, + col: 9, + }, + }, + left: { '@type': "Num", + '@token': 1, + '@role': [Binary, Expression, Left, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 720, + line: 31, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 721, + line: 31, + col: 10, + }, + }, + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 674, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 674, + line: 28, + col: 1, + }, + }, + lines: [], + }, + }, + op: { '@type': "FloorDiv", + '@token': "//", + '@role': [Arithmetic, Binary, Divide, Incomplete, Operator], + '@pos': { '@type': "uast:Positions", + }, + }, + right: { '@type': "Num", + '@token': 0, + '@role': [Binary, Expression, Literal, Number, Primitive, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 725, + line: 31, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 726, + line: 31, + col: 15, + }, + }, + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 732, + line: 33, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 732, + line: 33, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 734, + line: 33, + col: 7, + }, + }, + Name: "rv", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 737, + line: 33, + col: 10, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 759, + line: 33, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 762, + line: 33, + col: 35, + }, + }, + Format: "", + Value: "/", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 738, + line: 33, + col: 11, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 737, + line: 33, + col: 10, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 738, + line: 33, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 741, + line: 33, + col: 14, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 737, + line: 33, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 740, + line: 33, + col: 13, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 737, + line: 33, + col: 10, + }, + }, + Name: "test_client", + }, + ], + }, + keywords: [], + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 737, + line: 33, + col: 10, + }, + }, + Name: "get", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 768, + line: 34, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 774, + line: 34, + col: 11, + }, + }, + msg: ~, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 775, + line: 34, + col: 12, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "Num", + '@token': 500, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 793, + line: 34, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 796, + line: 34, + col: 33, + }, + }, + }, + ], + }, + left: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 776, + line: 34, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 778, + line: 34, + col: 15, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 775, + line: 34, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 777, + line: 34, + col: 14, + }, + }, + Name: "rv", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 775, + line: 34, + col: 12, + }, + }, + Name: "status_code", + }, + ], + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 801, + line: 35, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 807, + line: 35, + col: 11, + }, + }, + msg: ~, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 808, + line: 35, + col: 12, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 837, + line: 35, + col: 41, + }, + end: { '@type': "uast:Position", + offset: 839, + line: 35, + col: 43, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 836, + line: 35, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 838, + line: 35, + col: 42, + }, + }, + Name: "rv", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 836, + line: 35, + col: 40, + }, + }, + Name: "data", + }, + ], + }, + ], + }, + left: { '@type': "uast:String", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 808, + line: 35, + col: 12, + }, + }, + Format: "", + Value: "Internal Server Error", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "In", + '@token': "in", + '@role': [Contains, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 849, + line: 37, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 849, + line: 37, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 852, + line: 37, + col: 8, + }, + }, + Name: "err", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 855, + line: 37, + col: 11, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 856, + line: 37, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 859, + line: 37, + col: 15, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 855, + line: 37, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 858, + line: 37, + col: 14, + }, + }, + Name: "out", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 855, + line: 37, + col: 11, + }, + }, + Name: "getvalue", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 874, + line: 38, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 880, + line: 38, + col: 11, + }, + }, + msg: ~, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 881, + line: 38, + col: 12, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 38, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 890, + line: 38, + col: 21, + }, + }, + Format: "", + Value: "", + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 881, + line: 38, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 884, + line: 38, + col: 15, + }, + }, + Name: "err", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_101_dst.uast b/uast/diff/testdata/testcase_101_dst.uast new file mode 100644 index 00000000..32b12d6e --- /dev/null +++ b/uast/diff/testdata/testcase_101_dst.uast @@ -0,0 +1,681 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 13, + col: 12, + }, + }, + Name: "__version__", + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 13, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 276, + line: 13, + col: 20, + }, + }, + Format: "", + Value: "0.7", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 395, + line: 17, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 408, + line: 17, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 432, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 443, + line: 18, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 467, + line: 20, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 476, + line: 20, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 509, + line: 21, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 521, + line: 21, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 536, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 549, + line: 22, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 713, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 726, + line: 25, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 787, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 796, + line: 26, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 824, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 836, + line: 27, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 851, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 867, + line: 28, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 885, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 901, + line: 29, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 949, + line: 30, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 962, + line: 30, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Session", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../session", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 993, + line: 33, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1006, + line: 33, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1176, + line: 37, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1178, + line: 37, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1199, + line: 38, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1212, + line: 38, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1179, + line: 37, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1193, + line: 37, + col: 18, + }, + }, + Name: "json_available", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_101_src.uast b/uast/diff/testdata/testcase_101_src.uast new file mode 100644 index 00000000..c98a99db --- /dev/null +++ b/uast/diff/testdata/testcase_101_src.uast @@ -0,0 +1,636 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 15, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 387, + line: 15, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 411, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 422, + line: 16, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 455, + line: 18, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 488, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 500, + line: 19, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 515, + line: 20, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 528, + line: 20, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 692, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 705, + line: 23, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 766, + line: 24, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 775, + line: 24, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 803, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 815, + line: 25, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 830, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 846, + line: 26, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 864, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 880, + line: 27, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 928, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 941, + line: 28, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Session", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../session", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 972, + line: 31, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 985, + line: 31, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1155, + line: 35, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1157, + line: 35, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1178, + line: 36, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1191, + line: 36, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1158, + line: 35, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1172, + line: 35, + col: 18, + }, + }, + Name: "json_available", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_102_dst.uast b/uast/diff/testdata/testcase_102_dst.uast new file mode 100644 index 00000000..8bd55a0a --- /dev/null +++ b/uast/diff/testdata/testcase_102_dst.uast @@ -0,0 +1,681 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 13, + col: 12, + }, + }, + Name: "__version__", + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 13, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 280, + line: 13, + col: 24, + }, + }, + Format: "", + Value: "0.7-dev", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 399, + line: 17, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 412, + line: 17, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 436, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 447, + line: 18, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 471, + line: 20, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 480, + line: 20, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 513, + line: 21, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 525, + line: 21, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 540, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 553, + line: 22, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 717, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 730, + line: 25, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 791, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 800, + line: 26, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 828, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 840, + line: 27, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 855, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 871, + line: 28, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 889, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 905, + line: 29, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 953, + line: 30, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 966, + line: 30, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Session", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../session", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 997, + line: 33, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1010, + line: 33, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1180, + line: 37, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1182, + line: 37, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1203, + line: 38, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1216, + line: 38, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1183, + line: 37, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1197, + line: 37, + col: 18, + }, + }, + Name: "json_available", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_102_src.uast b/uast/diff/testdata/testcase_102_src.uast new file mode 100644 index 00000000..32b12d6e --- /dev/null +++ b/uast/diff/testdata/testcase_102_src.uast @@ -0,0 +1,681 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 13, + col: 12, + }, + }, + Name: "__version__", + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 13, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 276, + line: 13, + col: 20, + }, + }, + Format: "", + Value: "0.7", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 395, + line: 17, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 408, + line: 17, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 432, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 443, + line: 18, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 467, + line: 20, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 476, + line: 20, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 509, + line: 21, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 521, + line: 21, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 536, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 549, + line: 22, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 713, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 726, + line: 25, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 787, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 796, + line: 26, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 824, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 836, + line: 27, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 851, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 867, + line: 28, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 885, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 901, + line: 29, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 949, + line: 30, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 962, + line: 30, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Session", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../session", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 993, + line: 33, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1006, + line: 33, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1176, + line: 37, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1178, + line: 37, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1199, + line: 38, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1212, + line: 38, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1179, + line: 37, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1193, + line: 37, + col: 18, + }, + }, + Name: "json_available", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_103_dst.uast b/uast/diff/testdata/testcase_103_dst.uast new file mode 100644 index 00000000..32b12d6e --- /dev/null +++ b/uast/diff/testdata/testcase_103_dst.uast @@ -0,0 +1,681 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 13, + col: 12, + }, + }, + Name: "__version__", + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 13, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 276, + line: 13, + col: 20, + }, + }, + Format: "", + Value: "0.7", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 395, + line: 17, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 408, + line: 17, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 432, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 443, + line: 18, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 467, + line: 20, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 476, + line: 20, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 509, + line: 21, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 521, + line: 21, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 536, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 549, + line: 22, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 713, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 726, + line: 25, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 787, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 796, + line: 26, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 824, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 836, + line: 27, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 851, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 867, + line: 28, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 885, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 901, + line: 29, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 949, + line: 30, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 962, + line: 30, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Session", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../session", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 993, + line: 33, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1006, + line: 33, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1176, + line: 37, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1178, + line: 37, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1199, + line: 38, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1212, + line: 38, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1179, + line: 37, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1193, + line: 37, + col: 18, + }, + }, + Name: "json_available", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_103_src.uast b/uast/diff/testdata/testcase_103_src.uast new file mode 100644 index 00000000..8bd55a0a --- /dev/null +++ b/uast/diff/testdata/testcase_103_src.uast @@ -0,0 +1,681 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 13, + col: 12, + }, + }, + Name: "__version__", + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 13, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 280, + line: 13, + col: 24, + }, + }, + Format: "", + Value: "0.7-dev", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 399, + line: 17, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 412, + line: 17, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 436, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 447, + line: 18, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 471, + line: 20, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 480, + line: 20, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 513, + line: 21, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 525, + line: 21, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 540, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 553, + line: 22, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 717, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 730, + line: 25, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 791, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 800, + line: 26, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 828, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 840, + line: 27, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 855, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 871, + line: 28, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 889, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 905, + line: 29, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 953, + line: 30, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 966, + line: 30, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Session", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../session", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 997, + line: 33, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1010, + line: 33, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1180, + line: 37, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1182, + line: 37, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1203, + line: 38, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1216, + line: 38, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1183, + line: 37, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1197, + line: 37, + col: 18, + }, + }, + Name: "json_available", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_104_dst.uast b/uast/diff/testdata/testcase_104_dst.uast new file mode 100644 index 00000000..9a42a9f4 --- /dev/null +++ b/uast/diff/testdata/testcase_104_dst.uast @@ -0,0 +1,681 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 13, + col: 12, + }, + }, + Name: "__version__", + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 13, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 280, + line: 13, + col: 24, + }, + }, + Format: "", + Value: "0.8-dev", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 399, + line: 17, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 412, + line: 17, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 436, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 447, + line: 18, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 471, + line: 20, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 480, + line: 20, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 513, + line: 21, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 525, + line: 21, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 540, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 553, + line: 22, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 717, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 730, + line: 25, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 791, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 800, + line: 26, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 828, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 840, + line: 27, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 855, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 871, + line: 28, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 889, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 905, + line: 29, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 953, + line: 30, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 966, + line: 30, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Session", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../session", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 997, + line: 33, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1010, + line: 33, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1180, + line: 37, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1182, + line: 37, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1203, + line: 38, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1216, + line: 38, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1183, + line: 37, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1197, + line: 37, + col: 18, + }, + }, + Name: "json_available", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_104_src.uast b/uast/diff/testdata/testcase_104_src.uast new file mode 100644 index 00000000..32b12d6e --- /dev/null +++ b/uast/diff/testdata/testcase_104_src.uast @@ -0,0 +1,681 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 13, + col: 12, + }, + }, + Name: "__version__", + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 13, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 276, + line: 13, + col: 20, + }, + }, + Format: "", + Value: "0.7", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 395, + line: 17, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 408, + line: 17, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 432, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 443, + line: 18, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 467, + line: 20, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 476, + line: 20, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 509, + line: 21, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 521, + line: 21, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 536, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 549, + line: 22, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 713, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 726, + line: 25, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 787, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 796, + line: 26, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 824, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 836, + line: 27, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 851, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 867, + line: 28, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 885, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 901, + line: 29, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 949, + line: 30, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 962, + line: 30, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Session", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../session", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 993, + line: 33, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1006, + line: 33, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1176, + line: 37, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1178, + line: 37, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1199, + line: 38, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1212, + line: 38, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1179, + line: 37, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1193, + line: 37, + col: 18, + }, + }, + Name: "json_available", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_105_dst.uast b/uast/diff/testdata/testcase_105_dst.uast new file mode 100644 index 00000000..efee53e4 --- /dev/null +++ b/uast/diff/testdata/testcase_105_dst.uast @@ -0,0 +1,681 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 13, + col: 12, + }, + }, + Name: "__version__", + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 13, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 282, + line: 13, + col: 26, + }, + }, + Format: "", + Value: "0.7.1-dev", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 401, + line: 17, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 414, + line: 17, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 438, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 449, + line: 18, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 473, + line: 20, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 482, + line: 20, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 515, + line: 21, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 527, + line: 21, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 542, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 555, + line: 22, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 719, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 732, + line: 25, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 793, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 802, + line: 26, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 830, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 842, + line: 27, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 857, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 873, + line: 28, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 891, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 907, + line: 29, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 955, + line: 30, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 968, + line: 30, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Session", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../session", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 999, + line: 33, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1012, + line: 33, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1182, + line: 37, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1184, + line: 37, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1205, + line: 38, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1218, + line: 38, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1185, + line: 37, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1199, + line: 37, + col: 18, + }, + }, + Name: "json_available", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_105_src.uast b/uast/diff/testdata/testcase_105_src.uast new file mode 100644 index 00000000..9a42a9f4 --- /dev/null +++ b/uast/diff/testdata/testcase_105_src.uast @@ -0,0 +1,681 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 13, + col: 12, + }, + }, + Name: "__version__", + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 13, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 280, + line: 13, + col: 24, + }, + }, + Format: "", + Value: "0.8-dev", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 399, + line: 17, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 412, + line: 17, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 436, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 447, + line: 18, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 471, + line: 20, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 480, + line: 20, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 513, + line: 21, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 525, + line: 21, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 540, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 553, + line: 22, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 717, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 730, + line: 25, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 791, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 800, + line: 26, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 828, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 840, + line: 27, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 855, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 871, + line: 28, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 889, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 905, + line: 29, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 953, + line: 30, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 966, + line: 30, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Session", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../session", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 997, + line: 33, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1010, + line: 33, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1180, + line: 37, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1182, + line: 37, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1203, + line: 38, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1216, + line: 38, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1183, + line: 37, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1197, + line: 37, + col: 18, + }, + }, + Name: "json_available", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_106_dst.uast b/uast/diff/testdata/testcase_106_dst.uast new file mode 100644 index 00000000..9a42a9f4 --- /dev/null +++ b/uast/diff/testdata/testcase_106_dst.uast @@ -0,0 +1,681 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 13, + col: 12, + }, + }, + Name: "__version__", + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 13, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 280, + line: 13, + col: 24, + }, + }, + Format: "", + Value: "0.8-dev", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 399, + line: 17, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 412, + line: 17, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 436, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 447, + line: 18, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 471, + line: 20, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 480, + line: 20, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 513, + line: 21, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 525, + line: 21, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 540, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 553, + line: 22, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 717, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 730, + line: 25, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 791, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 800, + line: 26, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 828, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 840, + line: 27, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 855, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 871, + line: 28, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 889, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 905, + line: 29, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 953, + line: 30, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 966, + line: 30, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Session", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../session", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 997, + line: 33, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1010, + line: 33, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1180, + line: 37, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1182, + line: 37, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1203, + line: 38, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1216, + line: 38, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1183, + line: 37, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1197, + line: 37, + col: 18, + }, + }, + Name: "json_available", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_106_src.uast b/uast/diff/testdata/testcase_106_src.uast new file mode 100644 index 00000000..efee53e4 --- /dev/null +++ b/uast/diff/testdata/testcase_106_src.uast @@ -0,0 +1,681 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 13, + col: 12, + }, + }, + Name: "__version__", + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 13, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 282, + line: 13, + col: 26, + }, + }, + Format: "", + Value: "0.7.1-dev", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 401, + line: 17, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 414, + line: 17, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 438, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 449, + line: 18, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 473, + line: 20, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 482, + line: 20, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 515, + line: 21, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 527, + line: 21, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 542, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 555, + line: 22, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 719, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 732, + line: 25, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 793, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 802, + line: 26, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 830, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 842, + line: 27, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 857, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 873, + line: 28, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 891, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 907, + line: 29, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 955, + line: 30, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 968, + line: 30, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Session", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../session", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 999, + line: 33, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1012, + line: 33, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1182, + line: 37, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1184, + line: 37, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1205, + line: 38, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1218, + line: 38, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1185, + line: 37, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1199, + line: 37, + col: 18, + }, + }, + Name: "json_available", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_107_dst.uast b/uast/diff/testdata/testcase_107_dst.uast new file mode 100644 index 00000000..b14c76c5 --- /dev/null +++ b/uast/diff/testdata/testcase_107_dst.uast @@ -0,0 +1,652 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 13, + col: 12, + }, + }, + Name: "__version__", + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 13, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 280, + line: 13, + col: 24, + }, + }, + Format: "", + Value: "0.8-dev", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 399, + line: 17, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 412, + line: 17, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 436, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 447, + line: 18, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 471, + line: 20, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 480, + line: 20, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 513, + line: 21, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 525, + line: 21, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 540, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 553, + line: 22, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 717, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 730, + line: 25, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 791, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 800, + line: 26, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 828, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 840, + line: 27, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 855, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 871, + line: 28, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 889, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 905, + line: 29, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 968, + line: 32, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 981, + line: 32, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1151, + line: 36, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1153, + line: 36, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1174, + line: 37, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1187, + line: 37, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1154, + line: 36, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1168, + line: 36, + col: 18, + }, + }, + Name: "json_available", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_107_src.uast b/uast/diff/testdata/testcase_107_src.uast new file mode 100644 index 00000000..9a42a9f4 --- /dev/null +++ b/uast/diff/testdata/testcase_107_src.uast @@ -0,0 +1,681 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 13, + col: 12, + }, + }, + Name: "__version__", + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 13, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 280, + line: 13, + col: 24, + }, + }, + Format: "", + Value: "0.8-dev", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 399, + line: 17, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 412, + line: 17, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 436, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 447, + line: 18, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 471, + line: 20, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 480, + line: 20, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 513, + line: 21, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 525, + line: 21, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 540, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 553, + line: 22, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 717, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 730, + line: 25, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 791, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 800, + line: 26, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 828, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 840, + line: 27, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 855, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 871, + line: 28, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 889, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 905, + line: 29, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 953, + line: 30, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 966, + line: 30, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Session", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../session", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 997, + line: 33, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1010, + line: 33, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1180, + line: 37, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1182, + line: 37, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1203, + line: 38, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1216, + line: 38, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1183, + line: 37, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1197, + line: 37, + col: 18, + }, + }, + Name: "json_available", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_108_dst.uast b/uast/diff/testdata/testcase_108_dst.uast new file mode 100644 index 00000000..430234cc --- /dev/null +++ b/uast/diff/testdata/testcase_108_dst.uast @@ -0,0 +1,1625 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 220, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 223, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n flask.testsuite.deprecations\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n Tests deprecation support.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 224, + line: 11, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flask", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 237, + line: 12, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "unittest", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 253, + line: 13, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "FlaskTestCase", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "catch_warnings", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.testsuite", + }, + Target: ~, + }, + { '@type': "ClassDef", + '@token': "DeprecationsTestCase", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 319, + line: 16, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 339, + line: 16, + col: 27, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 340, + line: 16, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 353, + line: 16, + col: 41, + }, + }, + Name: "FlaskTestCase", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 365, + line: 18, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 388, + line: 18, + col: 32, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "test_init_jinja_globals", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "ClassDef", + '@token': "MyFlask", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 410, + line: 19, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 417, + line: 19, + col: 22, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 419, + line: 19, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 424, + line: 19, + col: 29, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 418, + line: 19, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 423, + line: 19, + col: 28, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 418, + line: 19, + col: 23, + }, + }, + Name: "Flask", + }, + ], + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 448, + line: 20, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 466, + line: 20, + col: 35, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "init_jinja_globals", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 490, + line: 21, + col: 17, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 490, + line: 21, + col: 17, + }, + }, + ctx: "Store", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 513, + line: 21, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 518, + line: 21, + col: 45, + }, + }, + Format: "", + Value: "foo", + }, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 491, + line: 21, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 495, + line: 21, + col: 22, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 490, + line: 21, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 494, + line: 21, + col: 21, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 495, + line: 21, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 504, + line: 21, + col: 31, + }, + }, + Name: "jinja_env", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 490, + line: 21, + col: 17, + }, + }, + Name: "globals", + }, + ], + }, + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 522, + line: 21, + col: 49, + }, + end: { '@type': "uast:Position", + offset: 526, + line: 21, + col: 53, + }, + }, + Format: "", + Value: "42", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 467, + line: 20, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 471, + line: 20, + col: 40, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 467, + line: 20, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 471, + line: 20, + col: 40, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "With", + '@token': "with", + '@role': [Block, Scope, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 536, + line: 23, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 540, + line: 23, + col: 13, + }, + }, + body: { '@type': "With.body", + '@role': [Block, Body, Incomplete, Scope], + 'body_stmts': [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 578, + line: 24, + col: 13, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 578, + line: 24, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 581, + line: 24, + col: 16, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 584, + line: 24, + col: 19, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 592, + line: 24, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 600, + line: 24, + col: 35, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 584, + line: 24, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 591, + line: 24, + col: 26, + }, + }, + Name: "MyFlask", + }, + keywords: [], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 614, + line: 25, + col: 13, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "foo", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 669, + line: 27, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 675, + line: 27, + col: 23, + }, + }, + value: { '@type': "Subscript", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 676, + line: 27, + col: 24, + }, + }, + ctx: "Load", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 698, + line: 27, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 703, + line: 27, + col: 51, + }, + }, + Format: "", + Value: "foo", + }, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 677, + line: 27, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 680, + line: 27, + col: 28, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 676, + line: 27, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 679, + line: 27, + col: 27, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 680, + line: 27, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 689, + line: 27, + col: 37, + }, + }, + Name: "jinja_env", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 676, + line: 27, + col: 24, + }, + }, + Name: "globals", + }, + ], + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 718, + line: 29, + col: 13, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 718, + line: 29, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 719, + line: 29, + col: 14, + }, + }, + Name: "c", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 722, + line: 29, + col: 17, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 723, + line: 29, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 726, + line: 29, + col: 21, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 722, + line: 29, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 725, + line: 29, + col: 20, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 722, + line: 29, + col: 17, + }, + }, + Name: "test_client", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 752, + line: 30, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 752, + line: 30, + col: 13, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 771, + line: 30, + col: 32, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 770, + line: 30, + col: 31, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 776, + line: 30, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 779, + line: 30, + col: 40, + }, + }, + Format: "", + Value: "/", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 771, + line: 30, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 772, + line: 30, + col: 33, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 770, + line: 30, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 771, + line: 30, + col: 32, + }, + }, + Name: "c", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 770, + line: 30, + col: 31, + }, + }, + Name: "get", + }, + ], + }, + keywords: [], + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 770, + line: 30, + col: 31, + }, + }, + Name: "data", + }, + ], + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 787, + line: 30, + col: 48, + }, + end: { '@type': "uast:Position", + offset: 791, + line: 30, + col: 52, + }, + }, + Format: "", + Value: "42", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 753, + line: 30, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 757, + line: 30, + col: 18, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 752, + line: 30, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 756, + line: 30, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 752, + line: 30, + col: 13, + }, + }, + Name: "assert_equal", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 805, + line: 31, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 805, + line: 31, + col: 13, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 823, + line: 31, + col: 31, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 827, + line: 31, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 830, + line: 31, + col: 38, + }, + }, + Name: "log", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 823, + line: 31, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 826, + line: 31, + col: 34, + }, + }, + Name: "len", + }, + keywords: [], + }, + { '@type': "Num", + '@token': 1, + '@role': [Argument, Call, Expression, Function, Literal, Name, Number, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 833, + line: 31, + col: 41, + }, + end: { '@type': "uast:Position", + offset: 834, + line: 31, + col: 42, + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 806, + line: 31, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 810, + line: 31, + col: 18, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 805, + line: 31, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 809, + line: 31, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 805, + line: 31, + col: 13, + }, + }, + Name: "assert_equal", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 848, + line: 32, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 854, + line: 32, + col: 19, + }, + }, + msg: ~, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 855, + line: 32, + col: 20, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 879, + line: 32, + col: 44, + }, + }, + args: [ + { '@type': "Subscript", + '@role': [Argument, Call, Expression, Function, Incomplete, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 883, + line: 32, + col: 48, + }, + }, + ctx: "Load", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 890, + line: 32, + col: 55, + }, + end: { '@type': "uast:Position", + offset: 899, + line: 32, + col: 64, + }, + }, + Format: "", + Value: "message", + }, + }, + value: { '@type': "Subscript", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 883, + line: 32, + col: 48, + }, + }, + ctx: "Load", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "Num", + '@token': 0, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 887, + line: 32, + col: 52, + }, + end: { '@type': "uast:Position", + offset: 888, + line: 32, + col: 53, + }, + }, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 883, + line: 32, + col: 48, + }, + end: { '@type': "uast:Position", + offset: 886, + line: 32, + col: 51, + }, + }, + Name: "log", + }, + }, + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 879, + line: 32, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 882, + line: 32, + col: 47, + }, + }, + Name: "str", + }, + keywords: [], + }, + ], + }, + left: { '@type': "uast:String", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 855, + line: 32, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 875, + line: 32, + col: 40, + }, + }, + Format: "", + Value: "init_jinja_globals", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "In", + '@token': "in", + '@role': [Contains, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + ], + }, + items: { '@type': "With.items", + '@role': [Block, Incomplete, Scope], + items: [ + { '@type': "withitem", + '@role': [Expression, Identifier, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + 'context_expr': { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 541, + line: 23, + col: 14, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 541, + line: 23, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 555, + line: 23, + col: 28, + }, + }, + Name: "catch_warnings", + }, + keywords: [], + }, + 'optional_vars': { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 561, + line: 23, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 564, + line: 23, + col: 37, + }, + }, + Name: "log", + }, + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 389, + line: 18, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 393, + line: 18, + col: 37, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 389, + line: 18, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 393, + line: 18, + col: 37, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 908, + line: 35, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 913, + line: 35, + col: 10, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "suite", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 921, + line: 36, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 921, + line: 36, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 926, + line: 36, + col: 10, + }, + }, + Name: "suite", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 929, + line: 36, + col: 13, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 930, + line: 36, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 938, + line: 36, + col: 22, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 929, + line: 36, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 937, + line: 36, + col: 21, + }, + }, + Name: "unittest", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 929, + line: 36, + col: 13, + }, + }, + Name: "TestSuite", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 954, + line: 37, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 954, + line: 37, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 968, + line: 37, + col: 19, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 987, + line: 37, + col: 38, + }, + end: { '@type': "uast:Position", + offset: 1007, + line: 37, + col: 58, + }, + }, + Name: "DeprecationsTestCase", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 969, + line: 37, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 977, + line: 37, + col: 28, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 968, + line: 37, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 976, + line: 37, + col: 27, + }, + }, + Name: "unittest", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 968, + line: 37, + col: 19, + }, + }, + Name: "makeSuite", + }, + ], + }, + keywords: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 955, + line: 37, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 960, + line: 37, + col: 11, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 954, + line: 37, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 959, + line: 37, + col: 10, + }, + }, + Name: "suite", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 954, + line: 37, + col: 5, + }, + }, + Name: "addTest", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1014, + line: 38, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1020, + line: 38, + col: 11, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1021, + line: 38, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 1026, + line: 38, + col: 17, + }, + }, + Name: "suite", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_108_src.uast b/uast/diff/testdata/testcase_108_src.uast new file mode 100644 index 00000000..148104ed --- /dev/null +++ b/uast/diff/testdata/testcase_108_src.uast @@ -0,0 +1,1578 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 220, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 223, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n flask.testsuite.deprecations\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n Tests deprecation support.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 224, + line: 11, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flask", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 237, + line: 12, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "unittest", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 253, + line: 13, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "FlaskTestCase", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "catch_warnings", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.testsuite", + }, + Target: ~, + }, + { '@type': "ClassDef", + '@token': "DeprecationsTestCase", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 319, + line: 16, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 339, + line: 16, + col: 27, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 340, + line: 16, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 353, + line: 16, + col: 41, + }, + }, + Name: "FlaskTestCase", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 365, + line: 18, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 388, + line: 18, + col: 32, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "test_init_jinja_globals", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "ClassDef", + '@token': "MyFlask", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 410, + line: 19, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 417, + line: 19, + col: 22, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 419, + line: 19, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 424, + line: 19, + col: 29, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 418, + line: 19, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 423, + line: 19, + col: 28, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 418, + line: 19, + col: 23, + }, + }, + Name: "Flask", + }, + ], + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 448, + line: 20, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 466, + line: 20, + col: 35, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "init_jinja_globals", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 490, + line: 21, + col: 17, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 490, + line: 21, + col: 17, + }, + }, + ctx: "Store", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 513, + line: 21, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 518, + line: 21, + col: 45, + }, + }, + Format: "", + Value: "foo", + }, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 491, + line: 21, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 495, + line: 21, + col: 22, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 490, + line: 21, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 494, + line: 21, + col: 21, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 495, + line: 21, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 504, + line: 21, + col: 31, + }, + }, + Name: "jinja_env", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 490, + line: 21, + col: 17, + }, + }, + Name: "globals", + }, + ], + }, + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 522, + line: 21, + col: 49, + }, + end: { '@type': "uast:Position", + offset: 526, + line: 21, + col: 53, + }, + }, + Format: "", + Value: "42", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 467, + line: 20, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 471, + line: 20, + col: 40, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 467, + line: 20, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 471, + line: 20, + col: 40, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "With", + '@token': "with", + '@role': [Block, Scope, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 536, + line: 23, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 540, + line: 23, + col: 13, + }, + }, + body: { '@type': "With.body", + '@role': [Block, Body, Incomplete, Scope], + 'body_stmts': [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 578, + line: 24, + col: 13, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 578, + line: 24, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 581, + line: 24, + col: 16, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 584, + line: 24, + col: 19, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 592, + line: 24, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 600, + line: 24, + col: 35, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 584, + line: 24, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 591, + line: 24, + col: 26, + }, + }, + Name: "MyFlask", + }, + keywords: [], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 614, + line: 25, + col: 13, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "foo", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 669, + line: 27, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 675, + line: 27, + col: 23, + }, + }, + value: { '@type': "Subscript", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 676, + line: 27, + col: 24, + }, + }, + ctx: "Load", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 698, + line: 27, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 703, + line: 27, + col: 51, + }, + }, + Format: "", + Value: "foo", + }, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 677, + line: 27, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 680, + line: 27, + col: 28, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 676, + line: 27, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 679, + line: 27, + col: 27, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 680, + line: 27, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 689, + line: 27, + col: 37, + }, + }, + Name: "jinja_env", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 676, + line: 27, + col: 24, + }, + }, + Name: "globals", + }, + ], + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 718, + line: 29, + col: 13, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 718, + line: 29, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 719, + line: 29, + col: 14, + }, + }, + Name: "c", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 722, + line: 29, + col: 17, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 723, + line: 29, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 726, + line: 29, + col: 21, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 722, + line: 29, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 725, + line: 29, + col: 20, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 722, + line: 29, + col: 17, + }, + }, + Name: "test_client", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 752, + line: 30, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 758, + line: 30, + col: 19, + }, + }, + msg: ~, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 759, + line: 30, + col: 20, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 778, + line: 30, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 782, + line: 30, + col: 43, + }, + }, + Format: "", + Value: "42", + }, + ], + }, + left: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 760, + line: 30, + col: 21, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 759, + line: 30, + col: 20, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 765, + line: 30, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 768, + line: 30, + col: 29, + }, + }, + Format: "", + Value: "/", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 760, + line: 30, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 761, + line: 30, + col: 22, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 759, + line: 30, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 760, + line: 30, + col: 21, + }, + }, + Name: "c", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 759, + line: 30, + col: 20, + }, + }, + Name: "get", + }, + ], + }, + keywords: [], + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 759, + line: 30, + col: 20, + }, + }, + Name: "data", + }, + ], + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 795, + line: 31, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 801, + line: 31, + col: 19, + }, + }, + msg: ~, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 802, + line: 31, + col: 20, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "Num", + '@token': 1, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 814, + line: 31, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 815, + line: 31, + col: 33, + }, + }, + }, + ], + }, + left: { '@type': "Call", + '@role': [Call, Expression, Function, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 802, + line: 31, + col: 20, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 806, + line: 31, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 809, + line: 31, + col: 27, + }, + }, + Name: "log", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 802, + line: 31, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 805, + line: 31, + col: 23, + }, + }, + Name: "len", + }, + keywords: [], + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 828, + line: 32, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 834, + line: 32, + col: 19, + }, + }, + msg: ~, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 835, + line: 32, + col: 20, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 859, + line: 32, + col: 44, + }, + }, + args: [ + { '@type': "Subscript", + '@role': [Argument, Call, Expression, Function, Incomplete, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 863, + line: 32, + col: 48, + }, + }, + ctx: "Load", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 870, + line: 32, + col: 55, + }, + end: { '@type': "uast:Position", + offset: 879, + line: 32, + col: 64, + }, + }, + Format: "", + Value: "message", + }, + }, + value: { '@type': "Subscript", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 863, + line: 32, + col: 48, + }, + }, + ctx: "Load", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "Num", + '@token': 0, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 867, + line: 32, + col: 52, + }, + end: { '@type': "uast:Position", + offset: 868, + line: 32, + col: 53, + }, + }, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 863, + line: 32, + col: 48, + }, + end: { '@type': "uast:Position", + offset: 866, + line: 32, + col: 51, + }, + }, + Name: "log", + }, + }, + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 859, + line: 32, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 862, + line: 32, + col: 47, + }, + }, + Name: "str", + }, + keywords: [], + }, + ], + }, + left: { '@type': "uast:String", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 835, + line: 32, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 855, + line: 32, + col: 40, + }, + }, + Format: "", + Value: "init_jinja_globals", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "In", + '@token': "in", + '@role': [Contains, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + ], + }, + items: { '@type': "With.items", + '@role': [Block, Incomplete, Scope], + items: [ + { '@type': "withitem", + '@role': [Expression, Identifier, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + 'context_expr': { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 541, + line: 23, + col: 14, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 541, + line: 23, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 555, + line: 23, + col: 28, + }, + }, + Name: "catch_warnings", + }, + keywords: [], + }, + 'optional_vars': { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 561, + line: 23, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 564, + line: 23, + col: 37, + }, + }, + Name: "log", + }, + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 389, + line: 18, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 393, + line: 18, + col: 37, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 389, + line: 18, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 393, + line: 18, + col: 37, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 35, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 893, + line: 35, + col: 10, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "suite", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 901, + line: 36, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 901, + line: 36, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 906, + line: 36, + col: 10, + }, + }, + Name: "suite", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 909, + line: 36, + col: 13, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 910, + line: 36, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 918, + line: 36, + col: 22, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 909, + line: 36, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 917, + line: 36, + col: 21, + }, + }, + Name: "unittest", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 909, + line: 36, + col: 13, + }, + }, + Name: "TestSuite", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 934, + line: 37, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 934, + line: 37, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 948, + line: 37, + col: 19, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 967, + line: 37, + col: 38, + }, + end: { '@type': "uast:Position", + offset: 987, + line: 37, + col: 58, + }, + }, + Name: "DeprecationsTestCase", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 949, + line: 37, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 957, + line: 37, + col: 28, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 948, + line: 37, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 956, + line: 37, + col: 27, + }, + }, + Name: "unittest", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 948, + line: 37, + col: 19, + }, + }, + Name: "makeSuite", + }, + ], + }, + keywords: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 935, + line: 37, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 940, + line: 37, + col: 11, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 934, + line: 37, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 939, + line: 37, + col: 10, + }, + }, + Name: "suite", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 934, + line: 37, + col: 5, + }, + }, + Name: "addTest", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 994, + line: 38, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1000, + line: 38, + col: 11, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1001, + line: 38, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 1006, + line: 38, + col: 17, + }, + }, + Name: "suite", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_109_dst.uast b/uast/diff/testdata/testcase_109_dst.uast new file mode 100644 index 00000000..000a5f08 --- /dev/null +++ b/uast/diff/testdata/testcase_109_dst.uast @@ -0,0 +1,1674 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 220, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 223, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n flask.testsuite.deprecations\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n Tests deprecation support.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 224, + line: 11, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flask", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 237, + line: 12, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "unittest", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 253, + line: 13, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "FlaskTestCase", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "catch_warnings", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.testsuite", + }, + Target: ~, + }, + { '@type': "ClassDef", + '@token': "DeprecationsTestCase", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 319, + line: 16, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 339, + line: 16, + col: 27, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 340, + line: 16, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 353, + line: 16, + col: 41, + }, + }, + Name: "FlaskTestCase", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 365, + line: 18, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 388, + line: 18, + col: 32, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "test_init_jinja_globals", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "ClassDef", + '@token': "MyFlask", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 410, + line: 19, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 417, + line: 19, + col: 22, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 419, + line: 19, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 424, + line: 19, + col: 29, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 418, + line: 19, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 423, + line: 19, + col: 28, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 418, + line: 19, + col: 23, + }, + }, + Name: "Flask", + }, + ], + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 448, + line: 20, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 466, + line: 20, + col: 35, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "init_jinja_globals", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 490, + line: 21, + col: 17, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 490, + line: 21, + col: 17, + }, + }, + ctx: "Store", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 513, + line: 21, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 518, + line: 21, + col: 45, + }, + }, + Format: "", + Value: "foo", + }, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 491, + line: 21, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 495, + line: 21, + col: 22, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 490, + line: 21, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 494, + line: 21, + col: 21, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 495, + line: 21, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 504, + line: 21, + col: 31, + }, + }, + Name: "jinja_env", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 490, + line: 21, + col: 17, + }, + }, + Name: "globals", + }, + ], + }, + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 522, + line: 21, + col: 49, + }, + end: { '@type': "uast:Position", + offset: 526, + line: 21, + col: 53, + }, + }, + Format: "", + Value: "42", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 467, + line: 20, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 471, + line: 20, + col: 40, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 467, + line: 20, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 471, + line: 20, + col: 40, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "With", + '@token': "with", + '@role': [Block, Scope, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 536, + line: 23, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 540, + line: 23, + col: 13, + }, + }, + body: { '@type': "With.body", + '@role': [Block, Body, Incomplete, Scope], + 'body_stmts': [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 578, + line: 24, + col: 13, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 578, + line: 24, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 581, + line: 24, + col: 16, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 584, + line: 24, + col: 19, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 592, + line: 24, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 600, + line: 24, + col: 35, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 584, + line: 24, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 591, + line: 24, + col: 26, + }, + }, + Name: "MyFlask", + }, + keywords: [], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 614, + line: 25, + col: 13, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "foo", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 669, + line: 27, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 675, + line: 27, + col: 23, + }, + }, + value: { '@type': "Subscript", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 676, + line: 27, + col: 24, + }, + }, + ctx: "Load", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 698, + line: 27, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 703, + line: 27, + col: 51, + }, + }, + Format: "", + Value: "foo", + }, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 677, + line: 27, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 680, + line: 27, + col: 28, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 676, + line: 27, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 679, + line: 27, + col: 27, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 680, + line: 27, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 689, + line: 27, + col: 37, + }, + }, + Name: "jinja_env", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 676, + line: 27, + col: 24, + }, + }, + Name: "globals", + }, + ], + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 718, + line: 29, + col: 13, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 718, + line: 29, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 719, + line: 29, + col: 14, + }, + }, + Name: "c", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 722, + line: 29, + col: 17, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 723, + line: 29, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 726, + line: 29, + col: 21, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 722, + line: 29, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 725, + line: 29, + col: 20, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 722, + line: 29, + col: 17, + }, + }, + Name: "test_client", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 752, + line: 30, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 752, + line: 30, + col: 13, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 771, + line: 30, + col: 32, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 770, + line: 30, + col: 31, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 776, + line: 30, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 779, + line: 30, + col: 40, + }, + }, + Format: "", + Value: "/", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 771, + line: 30, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 772, + line: 30, + col: 33, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 770, + line: 30, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 771, + line: 30, + col: 32, + }, + }, + Name: "c", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 770, + line: 30, + col: 31, + }, + }, + Name: "get", + }, + ], + }, + keywords: [], + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 770, + line: 30, + col: 31, + }, + }, + Name: "data", + }, + ], + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 787, + line: 30, + col: 48, + }, + end: { '@type': "uast:Position", + offset: 791, + line: 30, + col: 52, + }, + }, + Format: "", + Value: "42", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 753, + line: 30, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 757, + line: 30, + col: 18, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 752, + line: 30, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 756, + line: 30, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 752, + line: 30, + col: 13, + }, + }, + Name: "assert_equal", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 805, + line: 31, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 805, + line: 31, + col: 13, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 823, + line: 31, + col: 31, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 827, + line: 31, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 830, + line: 31, + col: 38, + }, + }, + Name: "log", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 823, + line: 31, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 826, + line: 31, + col: 34, + }, + }, + Name: "len", + }, + keywords: [], + }, + { '@type': "Num", + '@token': 1, + '@role': [Argument, Call, Expression, Function, Literal, Name, Number, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 833, + line: 31, + col: 41, + }, + end: { '@type': "uast:Position", + offset: 834, + line: 31, + col: 42, + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 806, + line: 31, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 810, + line: 31, + col: 18, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 805, + line: 31, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 809, + line: 31, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 805, + line: 31, + col: 13, + }, + }, + Name: "assert_equal", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 848, + line: 32, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 848, + line: 32, + col: 13, + }, + }, + args: [ + { '@type': "Compare", + '@role': [Argument, Binary, Call, Condition, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 861, + line: 32, + col: 26, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 885, + line: 32, + col: 50, + }, + }, + args: [ + { '@type': "Subscript", + '@role': [Argument, Call, Expression, Function, Incomplete, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 889, + line: 32, + col: 54, + }, + }, + ctx: "Load", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 896, + line: 32, + col: 61, + }, + end: { '@type': "uast:Position", + offset: 905, + line: 32, + col: 70, + }, + }, + Format: "", + Value: "message", + }, + }, + value: { '@type': "Subscript", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 889, + line: 32, + col: 54, + }, + }, + ctx: "Load", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "Num", + '@token': 0, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 893, + line: 32, + col: 58, + }, + end: { '@type': "uast:Position", + offset: 894, + line: 32, + col: 59, + }, + }, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 889, + line: 32, + col: 54, + }, + end: { '@type': "uast:Position", + offset: 892, + line: 32, + col: 57, + }, + }, + Name: "log", + }, + }, + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 885, + line: 32, + col: 50, + }, + end: { '@type': "uast:Position", + offset: 888, + line: 32, + col: 53, + }, + }, + Name: "str", + }, + keywords: [], + }, + ], + }, + left: { '@type': "uast:String", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 861, + line: 32, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 881, + line: 32, + col: 46, + }, + }, + Format: "", + Value: "init_jinja_globals", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "In", + '@token': "in", + '@role': [Contains, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 849, + line: 32, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 853, + line: 32, + col: 18, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 848, + line: 32, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 852, + line: 32, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 848, + line: 32, + col: 13, + }, + }, + Name: "assert_", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + items: { '@type': "With.items", + '@role': [Block, Incomplete, Scope], + items: [ + { '@type': "withitem", + '@role': [Expression, Identifier, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + 'context_expr': { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 541, + line: 23, + col: 14, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 541, + line: 23, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 555, + line: 23, + col: 28, + }, + }, + Name: "catch_warnings", + }, + keywords: [], + }, + 'optional_vars': { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 561, + line: 23, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 564, + line: 23, + col: 37, + }, + }, + Name: "log", + }, + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 389, + line: 18, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 393, + line: 18, + col: 37, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 389, + line: 18, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 393, + line: 18, + col: 37, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 915, + line: 35, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 920, + line: 35, + col: 10, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "suite", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 928, + line: 36, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 928, + line: 36, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 933, + line: 36, + col: 10, + }, + }, + Name: "suite", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 936, + line: 36, + col: 13, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 937, + line: 36, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 945, + line: 36, + col: 22, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 936, + line: 36, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 944, + line: 36, + col: 21, + }, + }, + Name: "unittest", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 936, + line: 36, + col: 13, + }, + }, + Name: "TestSuite", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 961, + line: 37, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 961, + line: 37, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 975, + line: 37, + col: 19, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 994, + line: 37, + col: 38, + }, + end: { '@type': "uast:Position", + offset: 1014, + line: 37, + col: 58, + }, + }, + Name: "DeprecationsTestCase", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 976, + line: 37, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 984, + line: 37, + col: 28, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 975, + line: 37, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 983, + line: 37, + col: 27, + }, + }, + Name: "unittest", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 975, + line: 37, + col: 19, + }, + }, + Name: "makeSuite", + }, + ], + }, + keywords: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 962, + line: 37, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 967, + line: 37, + col: 11, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 961, + line: 37, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 966, + line: 37, + col: 10, + }, + }, + Name: "suite", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 961, + line: 37, + col: 5, + }, + }, + Name: "addTest", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1021, + line: 38, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1027, + line: 38, + col: 11, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1028, + line: 38, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 1033, + line: 38, + col: 17, + }, + }, + Name: "suite", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_109_src.uast b/uast/diff/testdata/testcase_109_src.uast new file mode 100644 index 00000000..430234cc --- /dev/null +++ b/uast/diff/testdata/testcase_109_src.uast @@ -0,0 +1,1625 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 220, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 223, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n flask.testsuite.deprecations\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n Tests deprecation support.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 224, + line: 11, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flask", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 237, + line: 12, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "unittest", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 253, + line: 13, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "FlaskTestCase", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "catch_warnings", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.testsuite", + }, + Target: ~, + }, + { '@type': "ClassDef", + '@token': "DeprecationsTestCase", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 319, + line: 16, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 339, + line: 16, + col: 27, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 340, + line: 16, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 353, + line: 16, + col: 41, + }, + }, + Name: "FlaskTestCase", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 365, + line: 18, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 388, + line: 18, + col: 32, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "test_init_jinja_globals", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "ClassDef", + '@token': "MyFlask", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 410, + line: 19, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 417, + line: 19, + col: 22, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 419, + line: 19, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 424, + line: 19, + col: 29, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 418, + line: 19, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 423, + line: 19, + col: 28, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 418, + line: 19, + col: 23, + }, + }, + Name: "Flask", + }, + ], + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 448, + line: 20, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 466, + line: 20, + col: 35, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "init_jinja_globals", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 490, + line: 21, + col: 17, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 490, + line: 21, + col: 17, + }, + }, + ctx: "Store", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 513, + line: 21, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 518, + line: 21, + col: 45, + }, + }, + Format: "", + Value: "foo", + }, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 491, + line: 21, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 495, + line: 21, + col: 22, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 490, + line: 21, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 494, + line: 21, + col: 21, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 495, + line: 21, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 504, + line: 21, + col: 31, + }, + }, + Name: "jinja_env", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 490, + line: 21, + col: 17, + }, + }, + Name: "globals", + }, + ], + }, + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 522, + line: 21, + col: 49, + }, + end: { '@type': "uast:Position", + offset: 526, + line: 21, + col: 53, + }, + }, + Format: "", + Value: "42", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 467, + line: 20, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 471, + line: 20, + col: 40, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 467, + line: 20, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 471, + line: 20, + col: 40, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "With", + '@token': "with", + '@role': [Block, Scope, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 536, + line: 23, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 540, + line: 23, + col: 13, + }, + }, + body: { '@type': "With.body", + '@role': [Block, Body, Incomplete, Scope], + 'body_stmts': [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 578, + line: 24, + col: 13, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 578, + line: 24, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 581, + line: 24, + col: 16, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 584, + line: 24, + col: 19, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 592, + line: 24, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 600, + line: 24, + col: 35, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 584, + line: 24, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 591, + line: 24, + col: 26, + }, + }, + Name: "MyFlask", + }, + keywords: [], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 614, + line: 25, + col: 13, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "foo", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 669, + line: 27, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 675, + line: 27, + col: 23, + }, + }, + value: { '@type': "Subscript", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 676, + line: 27, + col: 24, + }, + }, + ctx: "Load", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 698, + line: 27, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 703, + line: 27, + col: 51, + }, + }, + Format: "", + Value: "foo", + }, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 677, + line: 27, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 680, + line: 27, + col: 28, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 676, + line: 27, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 679, + line: 27, + col: 27, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 680, + line: 27, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 689, + line: 27, + col: 37, + }, + }, + Name: "jinja_env", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 676, + line: 27, + col: 24, + }, + }, + Name: "globals", + }, + ], + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 718, + line: 29, + col: 13, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 718, + line: 29, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 719, + line: 29, + col: 14, + }, + }, + Name: "c", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 722, + line: 29, + col: 17, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 723, + line: 29, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 726, + line: 29, + col: 21, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 722, + line: 29, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 725, + line: 29, + col: 20, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 722, + line: 29, + col: 17, + }, + }, + Name: "test_client", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 752, + line: 30, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 752, + line: 30, + col: 13, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 771, + line: 30, + col: 32, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 770, + line: 30, + col: 31, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 776, + line: 30, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 779, + line: 30, + col: 40, + }, + }, + Format: "", + Value: "/", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 771, + line: 30, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 772, + line: 30, + col: 33, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 770, + line: 30, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 771, + line: 30, + col: 32, + }, + }, + Name: "c", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 770, + line: 30, + col: 31, + }, + }, + Name: "get", + }, + ], + }, + keywords: [], + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 770, + line: 30, + col: 31, + }, + }, + Name: "data", + }, + ], + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 787, + line: 30, + col: 48, + }, + end: { '@type': "uast:Position", + offset: 791, + line: 30, + col: 52, + }, + }, + Format: "", + Value: "42", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 753, + line: 30, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 757, + line: 30, + col: 18, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 752, + line: 30, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 756, + line: 30, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 752, + line: 30, + col: 13, + }, + }, + Name: "assert_equal", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 805, + line: 31, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 805, + line: 31, + col: 13, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 823, + line: 31, + col: 31, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 827, + line: 31, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 830, + line: 31, + col: 38, + }, + }, + Name: "log", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 823, + line: 31, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 826, + line: 31, + col: 34, + }, + }, + Name: "len", + }, + keywords: [], + }, + { '@type': "Num", + '@token': 1, + '@role': [Argument, Call, Expression, Function, Literal, Name, Number, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 833, + line: 31, + col: 41, + }, + end: { '@type': "uast:Position", + offset: 834, + line: 31, + col: 42, + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 806, + line: 31, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 810, + line: 31, + col: 18, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 805, + line: 31, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 809, + line: 31, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 805, + line: 31, + col: 13, + }, + }, + Name: "assert_equal", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 848, + line: 32, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 854, + line: 32, + col: 19, + }, + }, + msg: ~, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 855, + line: 32, + col: 20, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 879, + line: 32, + col: 44, + }, + }, + args: [ + { '@type': "Subscript", + '@role': [Argument, Call, Expression, Function, Incomplete, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 883, + line: 32, + col: 48, + }, + }, + ctx: "Load", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 890, + line: 32, + col: 55, + }, + end: { '@type': "uast:Position", + offset: 899, + line: 32, + col: 64, + }, + }, + Format: "", + Value: "message", + }, + }, + value: { '@type': "Subscript", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 883, + line: 32, + col: 48, + }, + }, + ctx: "Load", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "Num", + '@token': 0, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 887, + line: 32, + col: 52, + }, + end: { '@type': "uast:Position", + offset: 888, + line: 32, + col: 53, + }, + }, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 883, + line: 32, + col: 48, + }, + end: { '@type': "uast:Position", + offset: 886, + line: 32, + col: 51, + }, + }, + Name: "log", + }, + }, + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 879, + line: 32, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 882, + line: 32, + col: 47, + }, + }, + Name: "str", + }, + keywords: [], + }, + ], + }, + left: { '@type': "uast:String", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 855, + line: 32, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 875, + line: 32, + col: 40, + }, + }, + Format: "", + Value: "init_jinja_globals", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "In", + '@token': "in", + '@role': [Contains, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + ], + }, + items: { '@type': "With.items", + '@role': [Block, Incomplete, Scope], + items: [ + { '@type': "withitem", + '@role': [Expression, Identifier, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + 'context_expr': { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 541, + line: 23, + col: 14, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 541, + line: 23, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 555, + line: 23, + col: 28, + }, + }, + Name: "catch_warnings", + }, + keywords: [], + }, + 'optional_vars': { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 561, + line: 23, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 564, + line: 23, + col: 37, + }, + }, + Name: "log", + }, + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 389, + line: 18, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 393, + line: 18, + col: 37, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 389, + line: 18, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 393, + line: 18, + col: 37, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 908, + line: 35, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 913, + line: 35, + col: 10, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "suite", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 921, + line: 36, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 921, + line: 36, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 926, + line: 36, + col: 10, + }, + }, + Name: "suite", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 929, + line: 36, + col: 13, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 930, + line: 36, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 938, + line: 36, + col: 22, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 929, + line: 36, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 937, + line: 36, + col: 21, + }, + }, + Name: "unittest", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 929, + line: 36, + col: 13, + }, + }, + Name: "TestSuite", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 954, + line: 37, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 954, + line: 37, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 968, + line: 37, + col: 19, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 987, + line: 37, + col: 38, + }, + end: { '@type': "uast:Position", + offset: 1007, + line: 37, + col: 58, + }, + }, + Name: "DeprecationsTestCase", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 969, + line: 37, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 977, + line: 37, + col: 28, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 968, + line: 37, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 976, + line: 37, + col: 27, + }, + }, + Name: "unittest", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 968, + line: 37, + col: 19, + }, + }, + Name: "makeSuite", + }, + ], + }, + keywords: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 955, + line: 37, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 960, + line: 37, + col: 11, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 954, + line: 37, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 959, + line: 37, + col: 10, + }, + }, + Name: "suite", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 954, + line: 37, + col: 5, + }, + }, + Name: "addTest", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1014, + line: 38, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1020, + line: 38, + col: 11, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1021, + line: 38, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 1026, + line: 38, + col: 17, + }, + }, + Name: "suite", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_10_dst.uast b/uast/diff/testdata/testcase_10_dst.uast new file mode 100644 index 00000000..8275baeb --- /dev/null +++ b/uast/diff/testdata/testcase_10_dst.uast @@ -0,0 +1,398 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 22, + line: 2, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "sys", + }, + Node: {}, + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "os", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 20, + line: 1, + col: 21, + }, + }, + lines: [ + { '@type': "uast:Comment", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + }, + Block: false, + Prefix: "!/", + Suffix: "\n", + Tab: "", + Text: "usr/bin/env python", + }, + ], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 37, + line: 3, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 37, + line: 3, + col: 1, + }, + }, + args: [ + { '@type': "Num", + '@token': 0, + '@role': [Argument, Call, Expression, Function, Literal, Name, Number, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 53, + line: 3, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 54, + line: 3, + col: 18, + }, + }, + }, + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 56, + line: 3, + col: 20, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 72, + line: 3, + col: 36, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 88, + line: 3, + col: 52, + }, + end: { '@type': "uast:Position", + offset: 96, + line: 3, + col: 60, + }, + }, + Name: "__file__", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 73, + line: 3, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 75, + line: 3, + col: 39, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 72, + line: 3, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 74, + line: 3, + col: 38, + }, + }, + Name: "os", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 75, + line: 3, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 79, + line: 3, + col: 43, + }, + }, + Name: "path", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 72, + line: 3, + col: 36, + }, + }, + Name: "dirname", + }, + ], + }, + keywords: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 3, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 59, + line: 3, + col: 23, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 56, + line: 3, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 58, + line: 3, + col: 22, + }, + }, + Name: "os", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 59, + line: 3, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 63, + line: 3, + col: 27, + }, + }, + Name: "path", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 56, + line: 3, + col: 20, + }, + }, + Name: "abspath", + }, + ], + }, + keywords: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 38, + line: 3, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 41, + line: 3, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 37, + line: 3, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 40, + line: 3, + col: 4, + }, + }, + Name: "sys", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 41, + line: 3, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 45, + line: 3, + col: 9, + }, + }, + Name: "path", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 37, + line: 3, + col: 1, + }, + }, + Name: "insert", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 100, + line: 4, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "main", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.testsuite", + }, + Target: ~, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 133, + line: 5, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 133, + line: 5, + col: 1, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 133, + line: 5, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 137, + line: 5, + col: 5, + }, + }, + Name: "main", + }, + keywords: [], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_10_src.uast b/uast/diff/testdata/testcase_10_src.uast new file mode 100644 index 00000000..4c15dc9b --- /dev/null +++ b/uast/diff/testdata/testcase_10_src.uast @@ -0,0 +1,69 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 22, + line: 2, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "main", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.testsuite", + }, + Target: ~, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 55, + line: 3, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 55, + line: 3, + col: 1, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 55, + line: 3, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 59, + line: 3, + col: 5, + }, + }, + Name: "main", + }, + keywords: [], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_110_dst.uast b/uast/diff/testdata/testcase_110_dst.uast new file mode 100644 index 00000000..2d1e7128 --- /dev/null +++ b/uast/diff/testdata/testcase_110_dst.uast @@ -0,0 +1,1719 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 220, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 223, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n flask.testsuite.deprecations\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n Tests deprecation support.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 225, + line: 12, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 240, + line: 12, + col: 16, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "with_statement", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "__future__", + }, + Target: ~, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 264, + line: 14, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flask", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 263, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 263, + line: 13, + col: 1, + }, + }, + lines: [], + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 277, + line: 15, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "unittest", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 293, + line: 16, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "FlaskTestCase", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "catch_warnings", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.testsuite", + }, + Target: ~, + }, + { '@type': "ClassDef", + '@token': "DeprecationsTestCase", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 359, + line: 19, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 379, + line: 19, + col: 27, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 380, + line: 19, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 393, + line: 19, + col: 41, + }, + }, + Name: "FlaskTestCase", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 405, + line: 21, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 428, + line: 21, + col: 32, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "test_init_jinja_globals", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "ClassDef", + '@token': "MyFlask", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 450, + line: 22, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 457, + line: 22, + col: 22, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 459, + line: 22, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 464, + line: 22, + col: 29, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 458, + line: 22, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 463, + line: 22, + col: 28, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 458, + line: 22, + col: 23, + }, + }, + Name: "Flask", + }, + ], + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 488, + line: 23, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 506, + line: 23, + col: 35, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "init_jinja_globals", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 530, + line: 24, + col: 17, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 530, + line: 24, + col: 17, + }, + }, + ctx: "Store", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 553, + line: 24, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 558, + line: 24, + col: 45, + }, + }, + Format: "", + Value: "foo", + }, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 531, + line: 24, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 535, + line: 24, + col: 22, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 530, + line: 24, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 534, + line: 24, + col: 21, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 535, + line: 24, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 544, + line: 24, + col: 31, + }, + }, + Name: "jinja_env", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 530, + line: 24, + col: 17, + }, + }, + Name: "globals", + }, + ], + }, + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 562, + line: 24, + col: 49, + }, + end: { '@type': "uast:Position", + offset: 566, + line: 24, + col: 53, + }, + }, + Format: "", + Value: "42", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 507, + line: 23, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 511, + line: 23, + col: 40, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 507, + line: 23, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 511, + line: 23, + col: 40, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "With", + '@token': "with", + '@role': [Block, Scope, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 576, + line: 26, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 580, + line: 26, + col: 13, + }, + }, + body: { '@type': "With.body", + '@role': [Block, Body, Incomplete, Scope], + 'body_stmts': [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 618, + line: 27, + col: 13, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 618, + line: 27, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 621, + line: 27, + col: 16, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 624, + line: 27, + col: 19, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 632, + line: 27, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 640, + line: 27, + col: 35, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 624, + line: 27, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 631, + line: 27, + col: 26, + }, + }, + Name: "MyFlask", + }, + keywords: [], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 654, + line: 28, + col: 13, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "foo", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 709, + line: 30, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 715, + line: 30, + col: 23, + }, + }, + value: { '@type': "Subscript", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 716, + line: 30, + col: 24, + }, + }, + ctx: "Load", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 738, + line: 30, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 743, + line: 30, + col: 51, + }, + }, + Format: "", + Value: "foo", + }, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 717, + line: 30, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 720, + line: 30, + col: 28, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 716, + line: 30, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 719, + line: 30, + col: 27, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 720, + line: 30, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 729, + line: 30, + col: 37, + }, + }, + Name: "jinja_env", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 716, + line: 30, + col: 24, + }, + }, + Name: "globals", + }, + ], + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 758, + line: 32, + col: 13, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 758, + line: 32, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 759, + line: 32, + col: 14, + }, + }, + Name: "c", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 762, + line: 32, + col: 17, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 763, + line: 32, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 766, + line: 32, + col: 21, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 762, + line: 32, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 765, + line: 32, + col: 20, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 762, + line: 32, + col: 17, + }, + }, + Name: "test_client", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 792, + line: 33, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 792, + line: 33, + col: 13, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 811, + line: 33, + col: 32, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 810, + line: 33, + col: 31, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 816, + line: 33, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 819, + line: 33, + col: 40, + }, + }, + Format: "", + Value: "/", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 811, + line: 33, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 812, + line: 33, + col: 33, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 810, + line: 33, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 811, + line: 33, + col: 32, + }, + }, + Name: "c", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 810, + line: 33, + col: 31, + }, + }, + Name: "get", + }, + ], + }, + keywords: [], + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 810, + line: 33, + col: 31, + }, + }, + Name: "data", + }, + ], + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 827, + line: 33, + col: 48, + }, + end: { '@type': "uast:Position", + offset: 831, + line: 33, + col: 52, + }, + }, + Format: "", + Value: "42", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 793, + line: 33, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 797, + line: 33, + col: 18, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 792, + line: 33, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 796, + line: 33, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 792, + line: 33, + col: 13, + }, + }, + Name: "assert_equal", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 845, + line: 34, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 845, + line: 34, + col: 13, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 863, + line: 34, + col: 31, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 867, + line: 34, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 870, + line: 34, + col: 38, + }, + }, + Name: "log", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 863, + line: 34, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 866, + line: 34, + col: 34, + }, + }, + Name: "len", + }, + keywords: [], + }, + { '@type': "Num", + '@token': 1, + '@role': [Argument, Call, Expression, Function, Literal, Name, Number, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 873, + line: 34, + col: 41, + }, + end: { '@type': "uast:Position", + offset: 874, + line: 34, + col: 42, + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 846, + line: 34, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 850, + line: 34, + col: 18, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 845, + line: 34, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 849, + line: 34, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 845, + line: 34, + col: 13, + }, + }, + Name: "assert_equal", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 35, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 35, + col: 13, + }, + }, + args: [ + { '@type': "Compare", + '@role': [Argument, Binary, Call, Condition, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 901, + line: 35, + col: 26, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 925, + line: 35, + col: 50, + }, + }, + args: [ + { '@type': "Subscript", + '@role': [Argument, Call, Expression, Function, Incomplete, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 929, + line: 35, + col: 54, + }, + }, + ctx: "Load", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 936, + line: 35, + col: 61, + }, + end: { '@type': "uast:Position", + offset: 945, + line: 35, + col: 70, + }, + }, + Format: "", + Value: "message", + }, + }, + value: { '@type': "Subscript", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 929, + line: 35, + col: 54, + }, + }, + ctx: "Load", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "Num", + '@token': 0, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 933, + line: 35, + col: 58, + }, + end: { '@type': "uast:Position", + offset: 934, + line: 35, + col: 59, + }, + }, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 929, + line: 35, + col: 54, + }, + end: { '@type': "uast:Position", + offset: 932, + line: 35, + col: 57, + }, + }, + Name: "log", + }, + }, + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 925, + line: 35, + col: 50, + }, + end: { '@type': "uast:Position", + offset: 928, + line: 35, + col: 53, + }, + }, + Name: "str", + }, + keywords: [], + }, + ], + }, + left: { '@type': "uast:String", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 901, + line: 35, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 921, + line: 35, + col: 46, + }, + }, + Format: "", + Value: "init_jinja_globals", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "In", + '@token': "in", + '@role': [Contains, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 889, + line: 35, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 893, + line: 35, + col: 18, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 35, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 892, + line: 35, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 35, + col: 13, + }, + }, + Name: "assert_", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + items: { '@type': "With.items", + '@role': [Block, Incomplete, Scope], + items: [ + { '@type': "withitem", + '@role': [Expression, Identifier, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + 'context_expr': { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 581, + line: 26, + col: 14, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 581, + line: 26, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 595, + line: 26, + col: 28, + }, + }, + Name: "catch_warnings", + }, + keywords: [], + }, + 'optional_vars': { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 601, + line: 26, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 604, + line: 26, + col: 37, + }, + }, + Name: "log", + }, + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 429, + line: 21, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 433, + line: 21, + col: 37, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 429, + line: 21, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 433, + line: 21, + col: 37, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 955, + line: 38, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 960, + line: 38, + col: 10, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "suite", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 968, + line: 39, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 968, + line: 39, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 973, + line: 39, + col: 10, + }, + }, + Name: "suite", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 976, + line: 39, + col: 13, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 977, + line: 39, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 985, + line: 39, + col: 22, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 976, + line: 39, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 984, + line: 39, + col: 21, + }, + }, + Name: "unittest", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 976, + line: 39, + col: 13, + }, + }, + Name: "TestSuite", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1001, + line: 40, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1001, + line: 40, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1015, + line: 40, + col: 19, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1034, + line: 40, + col: 38, + }, + end: { '@type': "uast:Position", + offset: 1054, + line: 40, + col: 58, + }, + }, + Name: "DeprecationsTestCase", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1016, + line: 40, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 1024, + line: 40, + col: 28, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1015, + line: 40, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 1023, + line: 40, + col: 27, + }, + }, + Name: "unittest", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1015, + line: 40, + col: 19, + }, + }, + Name: "makeSuite", + }, + ], + }, + keywords: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1002, + line: 40, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 1007, + line: 40, + col: 11, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1001, + line: 40, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1006, + line: 40, + col: 10, + }, + }, + Name: "suite", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1001, + line: 40, + col: 5, + }, + }, + Name: "addTest", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1061, + line: 41, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1067, + line: 41, + col: 11, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1068, + line: 41, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 1073, + line: 41, + col: 17, + }, + }, + Name: "suite", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_110_src.uast b/uast/diff/testdata/testcase_110_src.uast new file mode 100644 index 00000000..000a5f08 --- /dev/null +++ b/uast/diff/testdata/testcase_110_src.uast @@ -0,0 +1,1674 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 220, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 223, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n flask.testsuite.deprecations\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n Tests deprecation support.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 224, + line: 11, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flask", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 237, + line: 12, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "unittest", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 253, + line: 13, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "FlaskTestCase", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "catch_warnings", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.testsuite", + }, + Target: ~, + }, + { '@type': "ClassDef", + '@token': "DeprecationsTestCase", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 319, + line: 16, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 339, + line: 16, + col: 27, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 340, + line: 16, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 353, + line: 16, + col: 41, + }, + }, + Name: "FlaskTestCase", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 365, + line: 18, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 388, + line: 18, + col: 32, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "test_init_jinja_globals", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "ClassDef", + '@token': "MyFlask", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 410, + line: 19, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 417, + line: 19, + col: 22, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 419, + line: 19, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 424, + line: 19, + col: 29, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 418, + line: 19, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 423, + line: 19, + col: 28, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 418, + line: 19, + col: 23, + }, + }, + Name: "Flask", + }, + ], + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 448, + line: 20, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 466, + line: 20, + col: 35, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "init_jinja_globals", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 490, + line: 21, + col: 17, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 490, + line: 21, + col: 17, + }, + }, + ctx: "Store", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 513, + line: 21, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 518, + line: 21, + col: 45, + }, + }, + Format: "", + Value: "foo", + }, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 491, + line: 21, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 495, + line: 21, + col: 22, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 490, + line: 21, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 494, + line: 21, + col: 21, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 495, + line: 21, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 504, + line: 21, + col: 31, + }, + }, + Name: "jinja_env", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 490, + line: 21, + col: 17, + }, + }, + Name: "globals", + }, + ], + }, + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 522, + line: 21, + col: 49, + }, + end: { '@type': "uast:Position", + offset: 526, + line: 21, + col: 53, + }, + }, + Format: "", + Value: "42", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 467, + line: 20, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 471, + line: 20, + col: 40, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 467, + line: 20, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 471, + line: 20, + col: 40, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "With", + '@token': "with", + '@role': [Block, Scope, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 536, + line: 23, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 540, + line: 23, + col: 13, + }, + }, + body: { '@type': "With.body", + '@role': [Block, Body, Incomplete, Scope], + 'body_stmts': [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 578, + line: 24, + col: 13, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 578, + line: 24, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 581, + line: 24, + col: 16, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 584, + line: 24, + col: 19, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 592, + line: 24, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 600, + line: 24, + col: 35, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 584, + line: 24, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 591, + line: 24, + col: 26, + }, + }, + Name: "MyFlask", + }, + keywords: [], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 614, + line: 25, + col: 13, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "foo", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 669, + line: 27, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 675, + line: 27, + col: 23, + }, + }, + value: { '@type': "Subscript", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 676, + line: 27, + col: 24, + }, + }, + ctx: "Load", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 698, + line: 27, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 703, + line: 27, + col: 51, + }, + }, + Format: "", + Value: "foo", + }, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 677, + line: 27, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 680, + line: 27, + col: 28, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 676, + line: 27, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 679, + line: 27, + col: 27, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 680, + line: 27, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 689, + line: 27, + col: 37, + }, + }, + Name: "jinja_env", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 676, + line: 27, + col: 24, + }, + }, + Name: "globals", + }, + ], + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 718, + line: 29, + col: 13, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 718, + line: 29, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 719, + line: 29, + col: 14, + }, + }, + Name: "c", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 722, + line: 29, + col: 17, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 723, + line: 29, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 726, + line: 29, + col: 21, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 722, + line: 29, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 725, + line: 29, + col: 20, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 722, + line: 29, + col: 17, + }, + }, + Name: "test_client", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 752, + line: 30, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 752, + line: 30, + col: 13, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 771, + line: 30, + col: 32, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 770, + line: 30, + col: 31, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 776, + line: 30, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 779, + line: 30, + col: 40, + }, + }, + Format: "", + Value: "/", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 771, + line: 30, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 772, + line: 30, + col: 33, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 770, + line: 30, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 771, + line: 30, + col: 32, + }, + }, + Name: "c", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 770, + line: 30, + col: 31, + }, + }, + Name: "get", + }, + ], + }, + keywords: [], + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 770, + line: 30, + col: 31, + }, + }, + Name: "data", + }, + ], + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 787, + line: 30, + col: 48, + }, + end: { '@type': "uast:Position", + offset: 791, + line: 30, + col: 52, + }, + }, + Format: "", + Value: "42", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 753, + line: 30, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 757, + line: 30, + col: 18, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 752, + line: 30, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 756, + line: 30, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 752, + line: 30, + col: 13, + }, + }, + Name: "assert_equal", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 805, + line: 31, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 805, + line: 31, + col: 13, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 823, + line: 31, + col: 31, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 827, + line: 31, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 830, + line: 31, + col: 38, + }, + }, + Name: "log", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 823, + line: 31, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 826, + line: 31, + col: 34, + }, + }, + Name: "len", + }, + keywords: [], + }, + { '@type': "Num", + '@token': 1, + '@role': [Argument, Call, Expression, Function, Literal, Name, Number, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 833, + line: 31, + col: 41, + }, + end: { '@type': "uast:Position", + offset: 834, + line: 31, + col: 42, + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 806, + line: 31, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 810, + line: 31, + col: 18, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 805, + line: 31, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 809, + line: 31, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 805, + line: 31, + col: 13, + }, + }, + Name: "assert_equal", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 848, + line: 32, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 848, + line: 32, + col: 13, + }, + }, + args: [ + { '@type': "Compare", + '@role': [Argument, Binary, Call, Condition, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 861, + line: 32, + col: 26, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 885, + line: 32, + col: 50, + }, + }, + args: [ + { '@type': "Subscript", + '@role': [Argument, Call, Expression, Function, Incomplete, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 889, + line: 32, + col: 54, + }, + }, + ctx: "Load", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 896, + line: 32, + col: 61, + }, + end: { '@type': "uast:Position", + offset: 905, + line: 32, + col: 70, + }, + }, + Format: "", + Value: "message", + }, + }, + value: { '@type': "Subscript", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 889, + line: 32, + col: 54, + }, + }, + ctx: "Load", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "Num", + '@token': 0, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 893, + line: 32, + col: 58, + }, + end: { '@type': "uast:Position", + offset: 894, + line: 32, + col: 59, + }, + }, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 889, + line: 32, + col: 54, + }, + end: { '@type': "uast:Position", + offset: 892, + line: 32, + col: 57, + }, + }, + Name: "log", + }, + }, + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 885, + line: 32, + col: 50, + }, + end: { '@type': "uast:Position", + offset: 888, + line: 32, + col: 53, + }, + }, + Name: "str", + }, + keywords: [], + }, + ], + }, + left: { '@type': "uast:String", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 861, + line: 32, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 881, + line: 32, + col: 46, + }, + }, + Format: "", + Value: "init_jinja_globals", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "In", + '@token': "in", + '@role': [Contains, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 849, + line: 32, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 853, + line: 32, + col: 18, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 848, + line: 32, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 852, + line: 32, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 848, + line: 32, + col: 13, + }, + }, + Name: "assert_", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + items: { '@type': "With.items", + '@role': [Block, Incomplete, Scope], + items: [ + { '@type': "withitem", + '@role': [Expression, Identifier, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + 'context_expr': { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 541, + line: 23, + col: 14, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 541, + line: 23, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 555, + line: 23, + col: 28, + }, + }, + Name: "catch_warnings", + }, + keywords: [], + }, + 'optional_vars': { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 561, + line: 23, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 564, + line: 23, + col: 37, + }, + }, + Name: "log", + }, + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 389, + line: 18, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 393, + line: 18, + col: 37, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 389, + line: 18, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 393, + line: 18, + col: 37, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 915, + line: 35, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 920, + line: 35, + col: 10, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "suite", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 928, + line: 36, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 928, + line: 36, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 933, + line: 36, + col: 10, + }, + }, + Name: "suite", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 936, + line: 36, + col: 13, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 937, + line: 36, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 945, + line: 36, + col: 22, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 936, + line: 36, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 944, + line: 36, + col: 21, + }, + }, + Name: "unittest", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 936, + line: 36, + col: 13, + }, + }, + Name: "TestSuite", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 961, + line: 37, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 961, + line: 37, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 975, + line: 37, + col: 19, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 994, + line: 37, + col: 38, + }, + end: { '@type': "uast:Position", + offset: 1014, + line: 37, + col: 58, + }, + }, + Name: "DeprecationsTestCase", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 976, + line: 37, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 984, + line: 37, + col: 28, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 975, + line: 37, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 983, + line: 37, + col: 27, + }, + }, + Name: "unittest", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 975, + line: 37, + col: 19, + }, + }, + Name: "makeSuite", + }, + ], + }, + keywords: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 962, + line: 37, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 967, + line: 37, + col: 11, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 961, + line: 37, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 966, + line: 37, + col: 10, + }, + }, + Name: "suite", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 961, + line: 37, + col: 5, + }, + }, + Name: "addTest", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1021, + line: 38, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1027, + line: 38, + col: 11, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1028, + line: 38, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 1033, + line: 38, + col: 17, + }, + }, + Name: "suite", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_111_dst.uast b/uast/diff/testdata/testcase_111_dst.uast new file mode 100644 index 00000000..434581b5 --- /dev/null +++ b/uast/diff/testdata/testcase_111_dst.uast @@ -0,0 +1,3016 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 212, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 215, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n flask.testsuite.appctx\n ~~~~~~~~~~~~~~~~~~~~~~\n\n Tests the application context.\n\n :copyright: (c) 2012 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 217, + line: 12, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 232, + line: 12, + col: 16, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "with_statement", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "__future__", + }, + Target: ~, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 256, + line: 14, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flask", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 255, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 13, + col: 1, + }, + }, + lines: [], + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 269, + line: 15, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "unittest", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 285, + line: 16, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "FlaskTestCase", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.testsuite", + }, + Target: ~, + }, + { '@type': "ClassDef", + '@token': "AppContextTestCase", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 335, + line: 19, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 353, + line: 19, + col: 25, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 354, + line: 19, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 367, + line: 19, + col: 39, + }, + }, + Name: "FlaskTestCase", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 379, + line: 21, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 404, + line: 21, + col: 34, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "test_basic_url_generation", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 420, + line: 22, + col: 9, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 420, + line: 22, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 423, + line: 22, + col: 12, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 426, + line: 22, + col: 15, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 438, + line: 22, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 446, + line: 22, + col: 35, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 427, + line: 22, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 432, + line: 22, + col: 21, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 426, + line: 22, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 431, + line: 22, + col: 20, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 426, + line: 22, + col: 15, + }, + }, + Name: "Flask", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 456, + line: 23, + col: 9, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 456, + line: 23, + col: 9, + }, + }, + ctx: "Store", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 467, + line: 23, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 480, + line: 23, + col: 33, + }, + }, + Format: "", + Value: "SERVER_NAME", + }, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 457, + line: 23, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 460, + line: 23, + col: 13, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 456, + line: 23, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 459, + line: 23, + col: 12, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 456, + line: 23, + col: 9, + }, + }, + Name: "config", + }, + ], + }, + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 484, + line: 23, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 495, + line: 23, + col: 48, + }, + }, + Format: "", + Value: "localhost", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 504, + line: 24, + col: 9, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 504, + line: 24, + col: 9, + }, + }, + ctx: "Store", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 515, + line: 24, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 537, + line: 24, + col: 42, + }, + }, + Format: "", + Value: "PREFERRED_URL_SCHEME", + }, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 505, + line: 24, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 508, + line: 24, + col: 13, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 504, + line: 24, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 507, + line: 24, + col: 12, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 504, + line: 24, + col: 9, + }, + }, + Name: "config", + }, + ], + }, + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 541, + line: 24, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 548, + line: 24, + col: 53, + }, + }, + Format: "", + Value: "https", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 558, + line: 26, + col: 9, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Pass", + '@token': "pass", + '@role': [Noop, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 607, + line: 28, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 611, + line: 28, + col: 17, + }, + }, + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 549, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 549, + line: 25, + col: 1, + }, + }, + lines: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "With", + '@token': "with", + '@role': [Block, Scope, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 621, + line: 30, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 625, + line: 30, + col: 13, + }, + }, + body: { '@type': "With.body", + '@role': [Block, Body, Incomplete, Scope], + 'body_stmts': [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 657, + line: 31, + col: 13, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 657, + line: 31, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 659, + line: 31, + col: 15, + }, + }, + Name: "rv", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 662, + line: 31, + col: 18, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 676, + line: 31, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 683, + line: 31, + col: 39, + }, + }, + Format: "", + Value: "index", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 663, + line: 31, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 668, + line: 31, + col: 24, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 662, + line: 31, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 667, + line: 31, + col: 23, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 662, + line: 31, + col: 18, + }, + }, + Name: "url_for", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 697, + line: 32, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 697, + line: 32, + col: 13, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 715, + line: 32, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 717, + line: 32, + col: 33, + }, + }, + Name: "rv", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 719, + line: 32, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 739, + line: 32, + col: 55, + }, + }, + Format: "", + Value: "https://localhost/", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 698, + line: 32, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 702, + line: 32, + col: 18, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 697, + line: 32, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 701, + line: 32, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 697, + line: 32, + col: 13, + }, + }, + Name: "assert_equal", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + items: { '@type': "With.items", + '@role': [Block, Incomplete, Scope], + items: [ + { '@type': "withitem", + '@role': [Expression, Identifier, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + 'context_expr': { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 626, + line: 30, + col: 14, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 627, + line: 30, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 630, + line: 30, + col: 18, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 626, + line: 30, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 629, + line: 30, + col: 17, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 626, + line: 30, + col: 14, + }, + }, + Name: "app_context", + }, + ], + }, + keywords: [], + }, + 'optional_vars': ~, + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 405, + line: 21, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 409, + line: 21, + col: 39, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 405, + line: 21, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 409, + line: 21, + col: 39, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 750, + line: 34, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 790, + line: 34, + col: 49, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "test_url_generation_requires_server_name", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 806, + line: 35, + col: 9, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 806, + line: 35, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 809, + line: 35, + col: 12, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 812, + line: 35, + col: 15, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 824, + line: 35, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 832, + line: 35, + col: 35, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 813, + line: 35, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 818, + line: 35, + col: 21, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 812, + line: 35, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 817, + line: 35, + col: 20, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 812, + line: 35, + col: 15, + }, + }, + Name: "Flask", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "With", + '@token': "with", + '@role': [Block, Scope, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 842, + line: 36, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 846, + line: 36, + col: 13, + }, + }, + body: { '@type': "With.body", + '@role': [Block, Body, Incomplete, Scope], + 'body_stmts': [ + { '@type': "With", + '@token': "with", + '@role': [Block, Scope, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 878, + line: 37, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 882, + line: 37, + col: 17, + }, + }, + body: { '@type': "With.body", + '@role': [Block, Body, Incomplete, Scope], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 933, + line: 38, + col: 17, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 933, + line: 38, + col: 17, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 947, + line: 38, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 954, + line: 38, + col: 38, + }, + }, + Format: "", + Value: "index", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 934, + line: 38, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 939, + line: 38, + col: 23, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 933, + line: 38, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 938, + line: 38, + col: 22, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 933, + line: 38, + col: 17, + }, + }, + Name: "url_for", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + items: { '@type': "With.items", + '@role': [Block, Incomplete, Scope], + items: [ + { '@type': "withitem", + '@role': [Expression, Identifier, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + 'context_expr': { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 883, + line: 37, + col: 18, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 902, + line: 37, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 914, + line: 37, + col: 49, + }, + }, + Name: "RuntimeError", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 884, + line: 37, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 888, + line: 37, + col: 23, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 883, + line: 37, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 887, + line: 37, + col: 22, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 883, + line: 37, + col: 18, + }, + }, + Name: "assert_raises", + }, + ], + }, + keywords: [], + }, + 'optional_vars': ~, + }, + ], + }, + }, + ], + }, + items: { '@type': "With.items", + '@role': [Block, Incomplete, Scope], + items: [ + { '@type': "withitem", + '@role': [Expression, Identifier, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + 'context_expr': { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 847, + line: 36, + col: 14, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 848, + line: 36, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 851, + line: 36, + col: 18, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 847, + line: 36, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 850, + line: 36, + col: 17, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 847, + line: 36, + col: 14, + }, + }, + Name: "app_context", + }, + ], + }, + keywords: [], + }, + 'optional_vars': ~, + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 791, + line: 34, + col: 50, + }, + end: { '@type': "uast:Position", + offset: 795, + line: 34, + col: 54, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 791, + line: 34, + col: 50, + }, + end: { '@type': "uast:Position", + offset: 795, + line: 34, + col: 54, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 965, + line: 40, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1006, + line: 40, + col: 50, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "test_url_generation_without_context_fails", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "With", + '@token': "with", + '@role': [Block, Scope, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1022, + line: 41, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1026, + line: 41, + col: 13, + }, + }, + body: { '@type': "With.body", + '@role': [Block, Body, Incomplete, Scope], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1073, + line: 42, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1073, + line: 42, + col: 13, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1087, + line: 42, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 1094, + line: 42, + col: 34, + }, + }, + Format: "", + Value: "index", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1074, + line: 42, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 1079, + line: 42, + col: 19, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1073, + line: 42, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1078, + line: 42, + col: 18, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1073, + line: 42, + col: 13, + }, + }, + Name: "url_for", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + items: { '@type': "With.items", + '@role': [Block, Incomplete, Scope], + items: [ + { '@type': "withitem", + '@role': [Expression, Identifier, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + 'context_expr': { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1027, + line: 41, + col: 14, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1046, + line: 41, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 1058, + line: 41, + col: 45, + }, + }, + Name: "RuntimeError", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1028, + line: 41, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 1032, + line: 41, + col: 19, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1027, + line: 41, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 1031, + line: 41, + col: 18, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1027, + line: 41, + col: 14, + }, + }, + Name: "assert_raises", + }, + ], + }, + keywords: [], + }, + 'optional_vars': ~, + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1007, + line: 40, + col: 51, + }, + end: { '@type': "uast:Position", + offset: 1011, + line: 40, + col: 55, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1007, + line: 40, + col: 51, + }, + end: { '@type': "uast:Position", + offset: 1011, + line: 40, + col: 55, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1105, + line: 44, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1143, + line: 44, + col: 47, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "test_request_context_means_app_context", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1159, + line: 45, + col: 9, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1159, + line: 45, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1162, + line: 45, + col: 12, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1165, + line: 45, + col: 15, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1177, + line: 45, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 1185, + line: 45, + col: 35, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1166, + line: 45, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 1171, + line: 45, + col: 21, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1165, + line: 45, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 1170, + line: 45, + col: 20, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1165, + line: 45, + col: 15, + }, + }, + Name: "Flask", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "With", + '@token': "with", + '@role': [Block, Scope, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1195, + line: 46, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1199, + line: 46, + col: 13, + }, + }, + body: { '@type': "With.body", + '@role': [Block, Body, Incomplete, Scope], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1240, + line: 47, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1240, + line: 47, + col: 13, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1258, + line: 47, + col: 31, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1259, + line: 47, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 1264, + line: 47, + col: 37, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1258, + line: 47, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 1263, + line: 47, + col: 36, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1264, + line: 47, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 1275, + line: 47, + col: 48, + }, + }, + Name: "current_app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1258, + line: 47, + col: 31, + }, + }, + Name: "_get_current_object", + }, + ], + }, + keywords: [], + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1299, + line: 47, + col: 72, + }, + end: { '@type': "uast:Position", + offset: 1302, + line: 47, + col: 75, + }, + }, + Name: "app", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1241, + line: 47, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 1245, + line: 47, + col: 18, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1240, + line: 47, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1244, + line: 47, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1240, + line: 47, + col: 13, + }, + }, + Name: "assert_equal", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + items: { '@type': "With.items", + '@role': [Block, Incomplete, Scope], + items: [ + { '@type': "withitem", + '@role': [Expression, Identifier, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + 'context_expr': { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1200, + line: 46, + col: 14, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1201, + line: 46, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 1204, + line: 46, + col: 18, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1200, + line: 46, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 1203, + line: 46, + col: 17, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1200, + line: 46, + col: 14, + }, + }, + Name: "test_request_context", + }, + ], + }, + keywords: [], + }, + 'optional_vars': ~, + }, + ], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1312, + line: 48, + col: 9, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1312, + line: 48, + col: 9, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1331, + line: 48, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 1336, + line: 48, + col: 33, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1330, + line: 48, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 1335, + line: 48, + col: 32, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1336, + line: 48, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 1350, + line: 48, + col: 47, + }, + }, + Name: "_app_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1330, + line: 48, + col: 27, + }, + }, + Name: "top", + }, + ], + }, + { '@type': "NoneLiteral", + '@token': "None", + '@role': [Argument, Call, Expression, Function, Literal, Name, 'Null', Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1356, + line: 48, + col: 53, + }, + end: { '@type': "uast:Position", + offset: 1360, + line: 48, + col: 57, + }, + }, + LiteralValue: "None", + value: ~, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1313, + line: 48, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 1317, + line: 48, + col: 14, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1312, + line: 48, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1316, + line: 48, + col: 13, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1312, + line: 48, + col: 9, + }, + }, + Name: "assert_equal", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1144, + line: 44, + col: 48, + }, + end: { '@type': "uast:Position", + offset: 1148, + line: 44, + col: 52, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1144, + line: 44, + col: 48, + }, + end: { '@type': "uast:Position", + offset: 1148, + line: 44, + col: 52, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1371, + line: 50, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1408, + line: 50, + col: 46, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "test_app_context_provides_current_app", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1424, + line: 51, + col: 9, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1424, + line: 51, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1427, + line: 51, + col: 12, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1430, + line: 51, + col: 15, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1442, + line: 51, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 1450, + line: 51, + col: 35, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1431, + line: 51, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 1436, + line: 51, + col: 21, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1430, + line: 51, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 1435, + line: 51, + col: 20, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1430, + line: 51, + col: 15, + }, + }, + Name: "Flask", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "With", + '@token': "with", + '@role': [Block, Scope, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1460, + line: 52, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1464, + line: 52, + col: 13, + }, + }, + body: { '@type': "With.body", + '@role': [Block, Body, Incomplete, Scope], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1496, + line: 53, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1496, + line: 53, + col: 13, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1514, + line: 53, + col: 31, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1515, + line: 53, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 1520, + line: 53, + col: 37, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1514, + line: 53, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 1519, + line: 53, + col: 36, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1520, + line: 53, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 1531, + line: 53, + col: 48, + }, + }, + Name: "current_app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1514, + line: 53, + col: 31, + }, + }, + Name: "_get_current_object", + }, + ], + }, + keywords: [], + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1555, + line: 53, + col: 72, + }, + end: { '@type': "uast:Position", + offset: 1558, + line: 53, + col: 75, + }, + }, + Name: "app", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1497, + line: 53, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 1501, + line: 53, + col: 18, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1496, + line: 53, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1500, + line: 53, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1496, + line: 53, + col: 13, + }, + }, + Name: "assert_equal", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + items: { '@type': "With.items", + '@role': [Block, Incomplete, Scope], + items: [ + { '@type': "withitem", + '@role': [Expression, Identifier, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + 'context_expr': { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1465, + line: 52, + col: 14, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1466, + line: 52, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 1469, + line: 52, + col: 18, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1465, + line: 52, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 1468, + line: 52, + col: 17, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1465, + line: 52, + col: 14, + }, + }, + Name: "app_context", + }, + ], + }, + keywords: [], + }, + 'optional_vars': ~, + }, + ], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1568, + line: 54, + col: 9, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1568, + line: 54, + col: 9, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1587, + line: 54, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 1592, + line: 54, + col: 33, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1586, + line: 54, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 1591, + line: 54, + col: 32, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1592, + line: 54, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 1606, + line: 54, + col: 47, + }, + }, + Name: "_app_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1586, + line: 54, + col: 27, + }, + }, + Name: "top", + }, + ], + }, + { '@type': "NoneLiteral", + '@token': "None", + '@role': [Argument, Call, Expression, Function, Literal, Name, 'Null', Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1612, + line: 54, + col: 53, + }, + end: { '@type': "uast:Position", + offset: 1616, + line: 54, + col: 57, + }, + }, + LiteralValue: "None", + value: ~, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1569, + line: 54, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 1573, + line: 54, + col: 14, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1568, + line: 54, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1572, + line: 54, + col: 13, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1568, + line: 54, + col: 9, + }, + }, + Name: "assert_equal", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1409, + line: 50, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 1413, + line: 50, + col: 51, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1409, + line: 50, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 1413, + line: 50, + col: 51, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1624, + line: 57, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1629, + line: 57, + col: 10, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "suite", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1637, + line: 58, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1637, + line: 58, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1642, + line: 58, + col: 10, + }, + }, + Name: "suite", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1645, + line: 58, + col: 13, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1646, + line: 58, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 1654, + line: 58, + col: 22, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1645, + line: 58, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1653, + line: 58, + col: 21, + }, + }, + Name: "unittest", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1645, + line: 58, + col: 13, + }, + }, + Name: "TestSuite", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1670, + line: 59, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1670, + line: 59, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1684, + line: 59, + col: 19, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1703, + line: 59, + col: 38, + }, + end: { '@type': "uast:Position", + offset: 1721, + line: 59, + col: 56, + }, + }, + Name: "AppContextTestCase", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1685, + line: 59, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 1693, + line: 59, + col: 28, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1684, + line: 59, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 1692, + line: 59, + col: 27, + }, + }, + Name: "unittest", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1684, + line: 59, + col: 19, + }, + }, + Name: "makeSuite", + }, + ], + }, + keywords: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1671, + line: 59, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 1676, + line: 59, + col: 11, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1670, + line: 59, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1675, + line: 59, + col: 10, + }, + }, + Name: "suite", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1670, + line: 59, + col: 5, + }, + }, + Name: "addTest", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1728, + line: 60, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1734, + line: 60, + col: 11, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1735, + line: 60, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 1740, + line: 60, + col: 17, + }, + }, + Name: "suite", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_111_src.uast b/uast/diff/testdata/testcase_111_src.uast new file mode 100644 index 00000000..860efb8b --- /dev/null +++ b/uast/diff/testdata/testcase_111_src.uast @@ -0,0 +1,1217 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 212, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 215, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n flask.testsuite.appctx\n ~~~~~~~~~~~~~~~~~~~~~~\n\n Tests the application context.\n\n :copyright: (c) 2012 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 217, + line: 12, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 232, + line: 12, + col: 16, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "with_statement", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "__future__", + }, + Target: ~, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 256, + line: 14, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flask", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 255, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 13, + col: 1, + }, + }, + lines: [], + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 269, + line: 15, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "unittest", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 285, + line: 16, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "FlaskTestCase", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.testsuite", + }, + Target: ~, + }, + { '@type': "ClassDef", + '@token': "AppContextTestCase", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 335, + line: 19, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 353, + line: 19, + col: 25, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 354, + line: 19, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 367, + line: 19, + col: 39, + }, + }, + Name: "FlaskTestCase", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 379, + line: 21, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 397, + line: 21, + col: 27, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "test_basic_support", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 413, + line: 22, + col: 9, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 413, + line: 22, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 416, + line: 22, + col: 12, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 419, + line: 22, + col: 15, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 431, + line: 22, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 439, + line: 22, + col: 35, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 420, + line: 22, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 425, + line: 22, + col: 21, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 419, + line: 22, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 424, + line: 22, + col: 20, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 419, + line: 22, + col: 15, + }, + }, + Name: "Flask", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 449, + line: 23, + col: 9, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 449, + line: 23, + col: 9, + }, + }, + ctx: "Store", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 460, + line: 23, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 473, + line: 23, + col: 33, + }, + }, + Format: "", + Value: "SERVER_NAME", + }, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 450, + line: 23, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 453, + line: 23, + col: 13, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 449, + line: 23, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 452, + line: 23, + col: 12, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 449, + line: 23, + col: 9, + }, + }, + Name: "config", + }, + ], + }, + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 477, + line: 23, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 488, + line: 23, + col: 48, + }, + }, + Format: "", + Value: "localhost", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 497, + line: 24, + col: 9, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 497, + line: 24, + col: 9, + }, + }, + ctx: "Store", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 508, + line: 24, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 530, + line: 24, + col: 42, + }, + }, + Format: "", + Value: "PREFERRED_URL_SCHEME", + }, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 498, + line: 24, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 501, + line: 24, + col: 13, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 497, + line: 24, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 500, + line: 24, + col: 12, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 497, + line: 24, + col: 9, + }, + }, + Name: "config", + }, + ], + }, + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 534, + line: 24, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 541, + line: 24, + col: 53, + }, + }, + Format: "", + Value: "https", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 551, + line: 26, + col: 9, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Pass", + '@token': "pass", + '@role': [Noop, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 600, + line: 28, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 604, + line: 28, + col: 17, + }, + }, + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 542, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 542, + line: 25, + col: 1, + }, + }, + lines: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "With", + '@token': "with", + '@role': [Block, Scope, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 614, + line: 30, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 618, + line: 30, + col: 13, + }, + }, + body: { '@type': "With.body", + '@role': [Block, Body, Incomplete, Scope], + 'body_stmts': [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 650, + line: 31, + col: 13, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 650, + line: 31, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 652, + line: 31, + col: 15, + }, + }, + Name: "rv", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 655, + line: 31, + col: 18, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 669, + line: 31, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 676, + line: 31, + col: 39, + }, + }, + Format: "", + Value: "index", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 656, + line: 31, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 661, + line: 31, + col: 24, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 655, + line: 31, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 660, + line: 31, + col: 23, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 655, + line: 31, + col: 18, + }, + }, + Name: "url_for", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 690, + line: 32, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 690, + line: 32, + col: 13, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 708, + line: 32, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 710, + line: 32, + col: 33, + }, + }, + Name: "rv", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 712, + line: 32, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 732, + line: 32, + col: 55, + }, + }, + Format: "", + Value: "https://localhost/", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 691, + line: 32, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 695, + line: 32, + col: 18, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 690, + line: 32, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 694, + line: 32, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 690, + line: 32, + col: 13, + }, + }, + Name: "assert_equal", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + items: { '@type': "With.items", + '@role': [Block, Incomplete, Scope], + items: [ + { '@type': "withitem", + '@role': [Expression, Identifier, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + 'context_expr': { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 619, + line: 30, + col: 14, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 620, + line: 30, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 623, + line: 30, + col: 18, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 619, + line: 30, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 622, + line: 30, + col: 17, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 619, + line: 30, + col: 14, + }, + }, + Name: "app_context", + }, + ], + }, + keywords: [], + }, + 'optional_vars': ~, + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 398, + line: 21, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 402, + line: 21, + col: 32, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 398, + line: 21, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 402, + line: 21, + col: 32, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 740, + line: 35, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 745, + line: 35, + col: 10, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "suite", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 753, + line: 36, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 753, + line: 36, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 758, + line: 36, + col: 10, + }, + }, + Name: "suite", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 761, + line: 36, + col: 13, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 762, + line: 36, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 770, + line: 36, + col: 22, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 761, + line: 36, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 769, + line: 36, + col: 21, + }, + }, + Name: "unittest", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 761, + line: 36, + col: 13, + }, + }, + Name: "TestSuite", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 786, + line: 37, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 786, + line: 37, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 800, + line: 37, + col: 19, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 819, + line: 37, + col: 38, + }, + end: { '@type': "uast:Position", + offset: 837, + line: 37, + col: 56, + }, + }, + Name: "AppContextTestCase", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 801, + line: 37, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 809, + line: 37, + col: 28, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 800, + line: 37, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 808, + line: 37, + col: 27, + }, + }, + Name: "unittest", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 800, + line: 37, + col: 19, + }, + }, + Name: "makeSuite", + }, + ], + }, + keywords: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 787, + line: 37, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 792, + line: 37, + col: 11, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 786, + line: 37, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 791, + line: 37, + col: 10, + }, + }, + Name: "suite", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 786, + line: 37, + col: 5, + }, + }, + Name: "addTest", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 844, + line: 38, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 850, + line: 38, + col: 11, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 851, + line: 38, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 856, + line: 38, + col: 17, + }, + }, + Name: "suite", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_112_dst.uast b/uast/diff/testdata/testcase_112_dst.uast new file mode 100644 index 00000000..0e24d942 --- /dev/null +++ b/uast/diff/testdata/testcase_112_dst.uast @@ -0,0 +1,1430 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 220, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 223, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n tests.deprecations\n ~~~~~~~~~~~~~~~~~~\n\n Tests deprecation support. Not used currently.\n\n :copyright: (c) 2015 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 225, + line: 12, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "pytest", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 224, + line: 11, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 224, + line: 11, + col: 1, + }, + }, + lines: [], + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 240, + line: 14, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flask", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 239, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 239, + line: 13, + col: 1, + }, + }, + lines: [], + }, + }, + { '@type': "ClassDef", + '@token': "TestRequestDeprecation", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 261, + line: 17, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 283, + line: 17, + col: 29, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 284, + line: 17, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 290, + line: 17, + col: 36, + }, + }, + Name: "object", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 301, + line: 18, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 318, + line: 18, + col: 26, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "test_request_json", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 356, + line: 19, + col: 9, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 356, + line: 19, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 388, + line: 19, + col: 41, + }, + }, + Format: "", + Value: "Request.json is deprecated", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 398, + line: 21, + col: 9, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 465, + line: 23, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 471, + line: 23, + col: 19, + }, + }, + msg: ~, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 472, + line: 23, + col: 20, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "Dict", + '@role': [Expression, Literal, Map, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 494, + line: 23, + col: 42, + }, + }, + keys: [ + { '@type': "uast:String", + '@role': [Key, Map], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 495, + line: 23, + col: 43, + }, + end: { '@type': "uast:Position", + offset: 501, + line: 23, + col: 49, + }, + }, + Format: "", + Value: "spam", + }, + ], + values: [ + { '@type': "Num", + '@token': 42, + '@role': [Expression, Literal, Map, Number, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 503, + line: 23, + col: 51, + }, + end: { '@type': "uast:Position", + offset: 505, + line: 23, + col: 53, + }, + }, + }, + ], + }, + ], + }, + left: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 473, + line: 23, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 478, + line: 23, + col: 26, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 472, + line: 23, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 477, + line: 23, + col: 25, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 478, + line: 23, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 485, + line: 23, + col: 33, + }, + }, + Name: "request", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 472, + line: 23, + col: 20, + }, + }, + Name: "json", + }, + ], + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 519, + line: 24, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 519, + line: 24, + col: 13, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 526, + line: 24, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 531, + line: 24, + col: 25, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 525, + line: 24, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 530, + line: 24, + col: 24, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 531, + line: 24, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 538, + line: 24, + col: 32, + }, + }, + Name: "request", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 525, + line: 24, + col: 19, + }, + }, + Name: "json", + }, + ], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 519, + line: 24, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 524, + line: 24, + col: 18, + }, + }, + Name: "print", + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 557, + line: 25, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 563, + line: 25, + col: 19, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 564, + line: 25, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 568, + line: 25, + col: 24, + }, + }, + Format: "", + Value: "OK", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 578, + line: 27, + col: 9, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 578, + line: 27, + col: 9, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 590, + line: 27, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 593, + line: 27, + col: 24, + }, + }, + Format: "", + Value: "/", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 579, + line: 27, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 585, + line: 27, + col: 16, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 578, + line: 27, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 584, + line: 27, + col: 15, + }, + }, + Name: "client", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 578, + line: 27, + col: 9, + }, + }, + Name: "post", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "data", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 600, + line: 27, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 614, + line: 27, + col: 45, + }, + }, + Format: "", + Value: "{\"spam\": 42}", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "content_type", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 629, + line: 27, + col: 60, + }, + end: { '@type': "uast:Position", + offset: 647, + line: 27, + col: 78, + }, + }, + Format: "", + Value: "application/json", + }, + }, + ], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 657, + line: 28, + col: 9, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 657, + line: 28, + col: 9, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 669, + line: 28, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 687, + line: 28, + col: 39, + }, + }, + Name: "DeprecationWarning", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 658, + line: 28, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 665, + line: 28, + col: 17, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 657, + line: 28, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 664, + line: 28, + col: 16, + }, + }, + Name: "recwarn", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 657, + line: 28, + col: 9, + }, + }, + Name: "pop", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 319, + line: 18, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 323, + line: 18, + col: 31, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 319, + line: 18, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 323, + line: 18, + col: 31, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 325, + line: 18, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 332, + line: 18, + col: 40, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 325, + line: 18, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 332, + line: 18, + col: 40, + }, + }, + Name: "recwarn", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 334, + line: 18, + col: 42, + }, + end: { '@type': "uast:Position", + offset: 337, + line: 18, + col: 45, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 334, + line: 18, + col: 42, + }, + end: { '@type': "uast:Position", + offset: 337, + line: 18, + col: 45, + }, + }, + Name: "app", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 339, + line: 18, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 345, + line: 18, + col: 53, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 339, + line: 18, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 345, + line: 18, + col: 53, + }, + }, + Name: "client", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 698, + line: 30, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 717, + line: 30, + col: 28, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "test_request_module", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 755, + line: 31, + col: 9, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 755, + line: 31, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 789, + line: 31, + col: 43, + }, + }, + Format: "", + Value: "Request.module is deprecated", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 799, + line: 33, + col: 9, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 848, + line: 35, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 854, + line: 35, + col: 19, + }, + }, + msg: ~, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 855, + line: 35, + col: 20, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 879, + line: 35, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 883, + line: 35, + col: 48, + }, + }, + LiteralValue: "None", + value: ~, + }, + ], + }, + left: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 856, + line: 35, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 861, + line: 35, + col: 26, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 855, + line: 35, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 860, + line: 35, + col: 25, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 861, + line: 35, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 868, + line: 35, + col: 33, + }, + }, + Name: "request", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 855, + line: 35, + col: 20, + }, + }, + Name: "module", + }, + ], + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Is", + '@token': "is", + '@role': [Identical, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 896, + line: 36, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 902, + line: 36, + col: 19, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 903, + line: 36, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 907, + line: 36, + col: 24, + }, + }, + Format: "", + Value: "OK", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 917, + line: 38, + col: 9, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 917, + line: 38, + col: 9, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 928, + line: 38, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 931, + line: 38, + col: 23, + }, + }, + Format: "", + Value: "/", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 918, + line: 38, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 924, + line: 38, + col: 16, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 917, + line: 38, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 923, + line: 38, + col: 15, + }, + }, + Name: "client", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 917, + line: 38, + col: 9, + }, + }, + Name: "get", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 941, + line: 39, + col: 9, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 941, + line: 39, + col: 9, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 953, + line: 39, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 971, + line: 39, + col: 39, + }, + }, + Name: "DeprecationWarning", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 942, + line: 39, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 949, + line: 39, + col: 17, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 941, + line: 39, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 948, + line: 39, + col: 16, + }, + }, + Name: "recwarn", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 941, + line: 39, + col: 9, + }, + }, + Name: "pop", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 718, + line: 30, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 722, + line: 30, + col: 33, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 718, + line: 30, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 722, + line: 30, + col: 33, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 724, + line: 30, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 731, + line: 30, + col: 42, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 724, + line: 30, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 731, + line: 30, + col: 42, + }, + }, + Name: "recwarn", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 733, + line: 30, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 736, + line: 30, + col: 47, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 733, + line: 30, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 736, + line: 30, + col: 47, + }, + }, + Name: "app", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 738, + line: 30, + col: 49, + }, + end: { '@type': "uast:Position", + offset: 744, + line: 30, + col: 55, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 738, + line: 30, + col: 49, + }, + end: { '@type': "uast:Position", + offset: 744, + line: 30, + col: 55, + }, + }, + Name: "client", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_112_src.uast b/uast/diff/testdata/testcase_112_src.uast new file mode 100644 index 00000000..c3a8d502 --- /dev/null +++ b/uast/diff/testdata/testcase_112_src.uast @@ -0,0 +1,1996 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 220, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 223, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n tests.deprecations\n ~~~~~~~~~~~~~~~~~~\n\n Tests deprecation support. Not used currently.\n\n :copyright: (c) 2015 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 225, + line: 12, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "pytest", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 224, + line: 11, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 224, + line: 11, + col: 1, + }, + }, + lines: [], + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 240, + line: 14, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flask", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 239, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 239, + line: 13, + col: 1, + }, + }, + lines: [], + }, + }, + { '@type': "ClassDef", + '@token': "TestRequestDeprecation", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 261, + line: 17, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 283, + line: 17, + col: 29, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 284, + line: 17, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 290, + line: 17, + col: 36, + }, + }, + Name: "object", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 302, + line: 19, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 319, + line: 19, + col: 26, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "test_request_json", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 363, + line: 20, + col: 9, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 363, + line: 20, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 395, + line: 20, + col: 41, + }, + }, + Format: "", + Value: "Request.json is deprecated", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 404, + line: 21, + col: 9, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 404, + line: 21, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 407, + line: 21, + col: 12, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 410, + line: 21, + col: 15, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 422, + line: 21, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 430, + line: 21, + col: 35, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 411, + line: 21, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 416, + line: 21, + col: 21, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 410, + line: 21, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 415, + line: 21, + col: 20, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 410, + line: 21, + col: 15, + }, + }, + Name: "Flask", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 440, + line: 22, + col: 9, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 441, + line: 22, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 444, + line: 22, + col: 13, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 440, + line: 22, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 443, + line: 22, + col: 12, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 440, + line: 22, + col: 9, + }, + }, + Name: "testing", + }, + ], + }, + ], + value: { '@type': "BoolLiteral", + '@token': "True", + '@role': [Boolean, Expression, Literal, Primitive, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 454, + line: 22, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 458, + line: 22, + col: 27, + }, + }, + value: true, + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 468, + line: 24, + col: 9, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 535, + line: 26, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 541, + line: 26, + col: 19, + }, + }, + msg: ~, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 542, + line: 26, + col: 20, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "Dict", + '@role': [Expression, Literal, Map, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 564, + line: 26, + col: 42, + }, + }, + keys: [ + { '@type': "uast:String", + '@role': [Key, Map], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 565, + line: 26, + col: 43, + }, + end: { '@type': "uast:Position", + offset: 571, + line: 26, + col: 49, + }, + }, + Format: "", + Value: "spam", + }, + ], + values: [ + { '@type': "Num", + '@token': 42, + '@role': [Expression, Literal, Map, Number, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 573, + line: 26, + col: 51, + }, + end: { '@type': "uast:Position", + offset: 575, + line: 26, + col: 53, + }, + }, + }, + ], + }, + ], + }, + left: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 543, + line: 26, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 548, + line: 26, + col: 26, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 542, + line: 26, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 547, + line: 26, + col: 25, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 548, + line: 26, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 555, + line: 26, + col: 33, + }, + }, + Name: "request", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 542, + line: 26, + col: 20, + }, + }, + Name: "json", + }, + ], + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 589, + line: 27, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 589, + line: 27, + col: 13, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 596, + line: 27, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 601, + line: 27, + col: 25, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 595, + line: 27, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 600, + line: 27, + col: 24, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 601, + line: 27, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 608, + line: 27, + col: 32, + }, + }, + Name: "request", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 595, + line: 27, + col: 19, + }, + }, + Name: "json", + }, + ], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 589, + line: 27, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 594, + line: 27, + col: 18, + }, + }, + Name: "print", + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 627, + line: 28, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 633, + line: 28, + col: 19, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 634, + line: 28, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 638, + line: 28, + col: 24, + }, + }, + Format: "", + Value: "OK", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "With", + '@token': "with", + '@role': [Block, Scope, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 648, + line: 30, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 652, + line: 30, + col: 13, + }, + }, + body: { '@type': "With.body", + '@role': [Block, Body, Incomplete, Scope], + 'body_stmts': [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 707, + line: 31, + col: 13, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 707, + line: 31, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 708, + line: 31, + col: 14, + }, + }, + Name: "c", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 711, + line: 31, + col: 17, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 712, + line: 31, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 715, + line: 31, + col: 21, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 711, + line: 31, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 714, + line: 31, + col: 20, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 711, + line: 31, + col: 17, + }, + }, + Name: "test_client", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 741, + line: 32, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 741, + line: 32, + col: 13, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 748, + line: 32, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 751, + line: 32, + col: 23, + }, + }, + Format: "", + Value: "/", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 742, + line: 32, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 743, + line: 32, + col: 15, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 741, + line: 32, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 742, + line: 32, + col: 14, + }, + }, + Name: "c", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 741, + line: 32, + col: 13, + }, + }, + Name: "post", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "data", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 758, + line: 32, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 772, + line: 32, + col: 44, + }, + }, + Format: "", + Value: "{\"spam\": 42}", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "content_type", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 787, + line: 32, + col: 59, + }, + end: { '@type': "uast:Position", + offset: 805, + line: 32, + col: 77, + }, + }, + Format: "", + Value: "application/json", + }, + }, + ], + }, + }, + ], + }, + items: { '@type': "With.items", + '@role': [Block, Incomplete, Scope], + items: [ + { '@type': "withitem", + '@role': [Expression, Identifier, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + 'context_expr': { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 653, + line: 30, + col: 14, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 653, + line: 30, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 679, + line: 30, + col: 40, + }, + }, + Name: "catch_deprecation_warnings", + }, + keywords: [], + }, + 'optional_vars': { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 685, + line: 30, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 693, + line: 30, + col: 54, + }, + }, + Name: "captured", + }, + }, + ], + }, + }, + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 816, + line: 34, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 822, + line: 34, + col: 15, + }, + }, + msg: ~, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 823, + line: 34, + col: 16, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "Num", + '@token': 1, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 840, + line: 34, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 841, + line: 34, + col: 34, + }, + }, + }, + ], + }, + left: { '@type': "Call", + '@role': [Call, Expression, Function, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 823, + line: 34, + col: 16, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 827, + line: 34, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 835, + line: 34, + col: 28, + }, + }, + Name: "captured", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 823, + line: 34, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 826, + line: 34, + col: 19, + }, + }, + Name: "len", + }, + keywords: [], + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 320, + line: 19, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 324, + line: 19, + col: 31, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 320, + line: 19, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 324, + line: 19, + col: 31, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 326, + line: 19, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 352, + line: 19, + col: 59, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 326, + line: 19, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 352, + line: 19, + col: 59, + }, + }, + Name: "catch_deprecation_warnings", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 851, + line: 36, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 870, + line: 36, + col: 28, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "test_request_module", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 914, + line: 37, + col: 9, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 914, + line: 37, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 948, + line: 37, + col: 43, + }, + }, + Format: "", + Value: "Request.module is deprecated", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 957, + line: 38, + col: 9, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 957, + line: 38, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 960, + line: 38, + col: 12, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 963, + line: 38, + col: 15, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 975, + line: 38, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 983, + line: 38, + col: 35, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 964, + line: 38, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 969, + line: 38, + col: 21, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 963, + line: 38, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 968, + line: 38, + col: 20, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 963, + line: 38, + col: 15, + }, + }, + Name: "Flask", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 993, + line: 39, + col: 9, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 994, + line: 39, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 997, + line: 39, + col: 13, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 993, + line: 39, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 996, + line: 39, + col: 12, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 993, + line: 39, + col: 9, + }, + }, + Name: "testing", + }, + ], + }, + ], + value: { '@type': "BoolLiteral", + '@token': "True", + '@role': [Boolean, Expression, Literal, Primitive, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1007, + line: 39, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 1011, + line: 39, + col: 27, + }, + }, + value: true, + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1021, + line: 41, + col: 9, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1070, + line: 43, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1076, + line: 43, + col: 19, + }, + }, + msg: ~, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1077, + line: 43, + col: 20, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1101, + line: 43, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 1105, + line: 43, + col: 48, + }, + }, + LiteralValue: "None", + value: ~, + }, + ], + }, + left: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1078, + line: 43, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 1083, + line: 43, + col: 26, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1077, + line: 43, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 1082, + line: 43, + col: 25, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1083, + line: 43, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 1090, + line: 43, + col: 33, + }, + }, + Name: "request", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1077, + line: 43, + col: 20, + }, + }, + Name: "module", + }, + ], + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Is", + '@token': "is", + '@role': [Identical, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1118, + line: 44, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1124, + line: 44, + col: 19, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1125, + line: 44, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 1129, + line: 44, + col: 24, + }, + }, + Format: "", + Value: "OK", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "With", + '@token': "with", + '@role': [Block, Scope, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1139, + line: 46, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1143, + line: 46, + col: 13, + }, + }, + body: { '@type': "With.body", + '@role': [Block, Body, Incomplete, Scope], + 'body_stmts': [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1198, + line: 47, + col: 13, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1198, + line: 47, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1199, + line: 47, + col: 14, + }, + }, + Name: "c", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1202, + line: 47, + col: 17, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1203, + line: 47, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 1206, + line: 47, + col: 21, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1202, + line: 47, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 1205, + line: 47, + col: 20, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1202, + line: 47, + col: 17, + }, + }, + Name: "test_client", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1232, + line: 48, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1232, + line: 48, + col: 13, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1238, + line: 48, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 1241, + line: 48, + col: 22, + }, + }, + Format: "", + Value: "/", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1233, + line: 48, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 1234, + line: 48, + col: 15, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1232, + line: 48, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1233, + line: 48, + col: 14, + }, + }, + Name: "c", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1232, + line: 48, + col: 13, + }, + }, + Name: "get", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + items: { '@type': "With.items", + '@role': [Block, Incomplete, Scope], + items: [ + { '@type': "withitem", + '@role': [Expression, Identifier, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + 'context_expr': { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1144, + line: 46, + col: 14, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1144, + line: 46, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 1170, + line: 46, + col: 40, + }, + }, + Name: "catch_deprecation_warnings", + }, + keywords: [], + }, + 'optional_vars': { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1176, + line: 46, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 1184, + line: 46, + col: 54, + }, + }, + Name: "captured", + }, + }, + ], + }, + }, + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1252, + line: 50, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1258, + line: 50, + col: 15, + }, + }, + msg: ~, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1259, + line: 50, + col: 16, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "Num", + '@token': 1, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1276, + line: 50, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 1277, + line: 50, + col: 34, + }, + }, + }, + ], + }, + left: { '@type': "Call", + '@role': [Call, Expression, Function, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1259, + line: 50, + col: 16, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1263, + line: 50, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 1271, + line: 50, + col: 28, + }, + }, + Name: "captured", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1259, + line: 50, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 1262, + line: 50, + col: 19, + }, + }, + Name: "len", + }, + keywords: [], + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 871, + line: 36, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 875, + line: 36, + col: 33, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 871, + line: 36, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 875, + line: 36, + col: 33, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 877, + line: 36, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 903, + line: 36, + col: 61, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 877, + line: 36, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 903, + line: 36, + col: 61, + }, + }, + Name: "catch_deprecation_warnings", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_113_dst.uast b/uast/diff/testdata/testcase_113_dst.uast new file mode 100644 index 00000000..a7eae88a --- /dev/null +++ b/uast/diff/testdata/testcase_113_dst.uast @@ -0,0 +1,843 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 220, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 223, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n tests.deprecations\n ~~~~~~~~~~~~~~~~~~\n\n Tests deprecation support. Not used currently.\n\n :copyright: (c) 2015 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 225, + line: 12, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flask", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 224, + line: 11, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 224, + line: 11, + col: 1, + }, + }, + lines: [], + }, + }, + { '@type': "ClassDef", + '@token': "TestRequestDeprecation", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 246, + line: 15, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 15, + col: 29, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 269, + line: 15, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 275, + line: 15, + col: 36, + }, + }, + Name: "object", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 286, + line: 16, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 303, + line: 16, + col: 26, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "test_request_json", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 341, + line: 17, + col: 9, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 341, + line: 17, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 373, + line: 17, + col: 41, + }, + }, + Format: "", + Value: "Request.json is deprecated", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 383, + line: 19, + col: 9, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 450, + line: 21, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 456, + line: 21, + col: 19, + }, + }, + msg: ~, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 457, + line: 21, + col: 20, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "Dict", + '@role': [Expression, Literal, Map, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 479, + line: 21, + col: 42, + }, + }, + keys: [ + { '@type': "uast:String", + '@role': [Key, Map], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 480, + line: 21, + col: 43, + }, + end: { '@type': "uast:Position", + offset: 486, + line: 21, + col: 49, + }, + }, + Format: "", + Value: "spam", + }, + ], + values: [ + { '@type': "Num", + '@token': 42, + '@role': [Expression, Literal, Map, Number, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 488, + line: 21, + col: 51, + }, + end: { '@type': "uast:Position", + offset: 490, + line: 21, + col: 53, + }, + }, + }, + ], + }, + ], + }, + left: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 458, + line: 21, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 463, + line: 21, + col: 26, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 457, + line: 21, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 462, + line: 21, + col: 25, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 463, + line: 21, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 470, + line: 21, + col: 33, + }, + }, + Name: "request", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 457, + line: 21, + col: 20, + }, + }, + Name: "json", + }, + ], + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 504, + line: 22, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 504, + line: 22, + col: 13, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 511, + line: 22, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 516, + line: 22, + col: 25, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 510, + line: 22, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 515, + line: 22, + col: 24, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 516, + line: 22, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 523, + line: 22, + col: 32, + }, + }, + Name: "request", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 510, + line: 22, + col: 19, + }, + }, + Name: "json", + }, + ], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 504, + line: 22, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 509, + line: 22, + col: 18, + }, + }, + Name: "print", + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 542, + line: 23, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 548, + line: 23, + col: 19, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 549, + line: 23, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 553, + line: 23, + col: 24, + }, + }, + Format: "", + Value: "OK", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 563, + line: 25, + col: 9, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 563, + line: 25, + col: 9, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 575, + line: 25, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 578, + line: 25, + col: 24, + }, + }, + Format: "", + Value: "/", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 564, + line: 25, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 570, + line: 25, + col: 16, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 563, + line: 25, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 569, + line: 25, + col: 15, + }, + }, + Name: "client", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 563, + line: 25, + col: 9, + }, + }, + Name: "post", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "data", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 585, + line: 25, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 599, + line: 25, + col: 45, + }, + }, + Format: "", + Value: "{\"spam\": 42}", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "content_type", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 614, + line: 25, + col: 60, + }, + end: { '@type': "uast:Position", + offset: 632, + line: 25, + col: 78, + }, + }, + Format: "", + Value: "application/json", + }, + }, + ], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 642, + line: 26, + col: 9, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 642, + line: 26, + col: 9, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 654, + line: 26, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 672, + line: 26, + col: 39, + }, + }, + Name: "DeprecationWarning", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 643, + line: 26, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 650, + line: 26, + col: 17, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 642, + line: 26, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 649, + line: 26, + col: 16, + }, + }, + Name: "recwarn", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 642, + line: 26, + col: 9, + }, + }, + Name: "pop", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 304, + line: 16, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 308, + line: 16, + col: 31, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 304, + line: 16, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 308, + line: 16, + col: 31, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 310, + line: 16, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 317, + line: 16, + col: 40, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 310, + line: 16, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 317, + line: 16, + col: 40, + }, + }, + Name: "recwarn", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 319, + line: 16, + col: 42, + }, + end: { '@type': "uast:Position", + offset: 322, + line: 16, + col: 45, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 319, + line: 16, + col: 42, + }, + end: { '@type': "uast:Position", + offset: 322, + line: 16, + col: 45, + }, + }, + Name: "app", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 324, + line: 16, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 330, + line: 16, + col: 53, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 324, + line: 16, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 330, + line: 16, + col: 53, + }, + }, + Name: "client", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_113_src.uast b/uast/diff/testdata/testcase_113_src.uast new file mode 100644 index 00000000..0e24d942 --- /dev/null +++ b/uast/diff/testdata/testcase_113_src.uast @@ -0,0 +1,1430 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 220, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 223, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n tests.deprecations\n ~~~~~~~~~~~~~~~~~~\n\n Tests deprecation support. Not used currently.\n\n :copyright: (c) 2015 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 225, + line: 12, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "pytest", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 224, + line: 11, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 224, + line: 11, + col: 1, + }, + }, + lines: [], + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 240, + line: 14, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flask", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 239, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 239, + line: 13, + col: 1, + }, + }, + lines: [], + }, + }, + { '@type': "ClassDef", + '@token': "TestRequestDeprecation", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 261, + line: 17, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 283, + line: 17, + col: 29, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 284, + line: 17, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 290, + line: 17, + col: 36, + }, + }, + Name: "object", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 301, + line: 18, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 318, + line: 18, + col: 26, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "test_request_json", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 356, + line: 19, + col: 9, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 356, + line: 19, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 388, + line: 19, + col: 41, + }, + }, + Format: "", + Value: "Request.json is deprecated", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 398, + line: 21, + col: 9, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 465, + line: 23, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 471, + line: 23, + col: 19, + }, + }, + msg: ~, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 472, + line: 23, + col: 20, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "Dict", + '@role': [Expression, Literal, Map, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 494, + line: 23, + col: 42, + }, + }, + keys: [ + { '@type': "uast:String", + '@role': [Key, Map], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 495, + line: 23, + col: 43, + }, + end: { '@type': "uast:Position", + offset: 501, + line: 23, + col: 49, + }, + }, + Format: "", + Value: "spam", + }, + ], + values: [ + { '@type': "Num", + '@token': 42, + '@role': [Expression, Literal, Map, Number, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 503, + line: 23, + col: 51, + }, + end: { '@type': "uast:Position", + offset: 505, + line: 23, + col: 53, + }, + }, + }, + ], + }, + ], + }, + left: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 473, + line: 23, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 478, + line: 23, + col: 26, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 472, + line: 23, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 477, + line: 23, + col: 25, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 478, + line: 23, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 485, + line: 23, + col: 33, + }, + }, + Name: "request", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 472, + line: 23, + col: 20, + }, + }, + Name: "json", + }, + ], + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 519, + line: 24, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 519, + line: 24, + col: 13, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 526, + line: 24, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 531, + line: 24, + col: 25, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 525, + line: 24, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 530, + line: 24, + col: 24, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 531, + line: 24, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 538, + line: 24, + col: 32, + }, + }, + Name: "request", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 525, + line: 24, + col: 19, + }, + }, + Name: "json", + }, + ], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 519, + line: 24, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 524, + line: 24, + col: 18, + }, + }, + Name: "print", + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 557, + line: 25, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 563, + line: 25, + col: 19, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 564, + line: 25, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 568, + line: 25, + col: 24, + }, + }, + Format: "", + Value: "OK", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 578, + line: 27, + col: 9, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 578, + line: 27, + col: 9, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 590, + line: 27, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 593, + line: 27, + col: 24, + }, + }, + Format: "", + Value: "/", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 579, + line: 27, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 585, + line: 27, + col: 16, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 578, + line: 27, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 584, + line: 27, + col: 15, + }, + }, + Name: "client", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 578, + line: 27, + col: 9, + }, + }, + Name: "post", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "data", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 600, + line: 27, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 614, + line: 27, + col: 45, + }, + }, + Format: "", + Value: "{\"spam\": 42}", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "content_type", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 629, + line: 27, + col: 60, + }, + end: { '@type': "uast:Position", + offset: 647, + line: 27, + col: 78, + }, + }, + Format: "", + Value: "application/json", + }, + }, + ], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 657, + line: 28, + col: 9, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 657, + line: 28, + col: 9, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 669, + line: 28, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 687, + line: 28, + col: 39, + }, + }, + Name: "DeprecationWarning", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 658, + line: 28, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 665, + line: 28, + col: 17, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 657, + line: 28, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 664, + line: 28, + col: 16, + }, + }, + Name: "recwarn", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 657, + line: 28, + col: 9, + }, + }, + Name: "pop", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 319, + line: 18, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 323, + line: 18, + col: 31, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 319, + line: 18, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 323, + line: 18, + col: 31, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 325, + line: 18, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 332, + line: 18, + col: 40, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 325, + line: 18, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 332, + line: 18, + col: 40, + }, + }, + Name: "recwarn", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 334, + line: 18, + col: 42, + }, + end: { '@type': "uast:Position", + offset: 337, + line: 18, + col: 45, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 334, + line: 18, + col: 42, + }, + end: { '@type': "uast:Position", + offset: 337, + line: 18, + col: 45, + }, + }, + Name: "app", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 339, + line: 18, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 345, + line: 18, + col: 53, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 339, + line: 18, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 345, + line: 18, + col: 53, + }, + }, + Name: "client", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 698, + line: 30, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 717, + line: 30, + col: 28, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "test_request_module", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 755, + line: 31, + col: 9, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 755, + line: 31, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 789, + line: 31, + col: 43, + }, + }, + Format: "", + Value: "Request.module is deprecated", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 799, + line: 33, + col: 9, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 848, + line: 35, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 854, + line: 35, + col: 19, + }, + }, + msg: ~, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 855, + line: 35, + col: 20, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 879, + line: 35, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 883, + line: 35, + col: 48, + }, + }, + LiteralValue: "None", + value: ~, + }, + ], + }, + left: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 856, + line: 35, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 861, + line: 35, + col: 26, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 855, + line: 35, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 860, + line: 35, + col: 25, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 861, + line: 35, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 868, + line: 35, + col: 33, + }, + }, + Name: "request", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 855, + line: 35, + col: 20, + }, + }, + Name: "module", + }, + ], + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Is", + '@token': "is", + '@role': [Identical, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 896, + line: 36, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 902, + line: 36, + col: 19, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 903, + line: 36, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 907, + line: 36, + col: 24, + }, + }, + Format: "", + Value: "OK", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 917, + line: 38, + col: 9, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 917, + line: 38, + col: 9, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 928, + line: 38, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 931, + line: 38, + col: 23, + }, + }, + Format: "", + Value: "/", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 918, + line: 38, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 924, + line: 38, + col: 16, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 917, + line: 38, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 923, + line: 38, + col: 15, + }, + }, + Name: "client", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 917, + line: 38, + col: 9, + }, + }, + Name: "get", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 941, + line: 39, + col: 9, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 941, + line: 39, + col: 9, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 953, + line: 39, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 971, + line: 39, + col: 39, + }, + }, + Name: "DeprecationWarning", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 942, + line: 39, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 949, + line: 39, + col: 17, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 941, + line: 39, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 948, + line: 39, + col: 16, + }, + }, + Name: "recwarn", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 941, + line: 39, + col: 9, + }, + }, + Name: "pop", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 718, + line: 30, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 722, + line: 30, + col: 33, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 718, + line: 30, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 722, + line: 30, + col: 33, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 724, + line: 30, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 731, + line: 30, + col: 42, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 724, + line: 30, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 731, + line: 30, + col: 42, + }, + }, + Name: "recwarn", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 733, + line: 30, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 736, + line: 30, + col: 47, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 733, + line: 30, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 736, + line: 30, + col: 47, + }, + }, + Name: "app", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 738, + line: 30, + col: 49, + }, + end: { '@type': "uast:Position", + offset: 744, + line: 30, + col: 55, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 738, + line: 30, + col: 49, + }, + end: { '@type': "uast:Position", + offset: 744, + line: 30, + col: 55, + }, + }, + Name: "client", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_114_dst.uast b/uast/diff/testdata/testcase_114_dst.uast new file mode 100644 index 00000000..b8137c85 --- /dev/null +++ b/uast/diff/testdata/testcase_114_dst.uast @@ -0,0 +1,1673 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 281, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 284, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask.testing\n ~~~~~~~~~~~~~\n\n Implements test support helpers. This module is lazily imported\n and usually not used in production environments.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 285, + line: 12, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 298, + line: 12, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Client", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 313, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 323, + line: 13, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "ClassDef", + '@token': "FlaskClient", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 358, + line: 16, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 369, + line: 16, + col: 18, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 370, + line: 16, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 376, + line: 16, + col: 25, + }, + }, + Name: "Client", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 592, + line: 21, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 383, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 599, + line: 21, + col: 8, + }, + }, + Format: "", + Value: "Works like a regular Werkzeug test client but has some\n knowledge about how Flask works to defer the cleanup of the\n request context stack to the end of a with body when used\n in a with statement.\n ", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 605, + line: 23, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 605, + line: 23, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 621, + line: 23, + col: 21, + }, + }, + Name: "preserve_context", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 624, + line: 23, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 641, + line: 23, + col: 41, + }, + }, + Name: "context_preserved", + }, + ], + value: { '@type': "BoolLiteral", + '@token': "False", + '@role': [Boolean, Expression, Literal, Primitive, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 644, + line: 23, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 649, + line: 23, + col: 49, + }, + }, + value: false, + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 659, + line: 25, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 663, + line: 25, + col: 13, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "open", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 696, + line: 26, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 698, + line: 26, + col: 11, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 735, + line: 27, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 735, + line: 27, + col: 13, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 736, + line: 27, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 754, + line: 27, + col: 32, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 735, + line: 27, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 753, + line: 27, + col: 31, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 735, + line: 27, + col: 13, + }, + }, + Name: "pop", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 772, + line: 28, + col: 13, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 773, + line: 28, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 777, + line: 28, + col: 18, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 772, + line: 28, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 776, + line: 28, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 772, + line: 28, + col: 13, + }, + }, + Name: "context_preserved", + }, + ], + }, + ], + value: { '@type': "BoolLiteral", + '@token': "False", + '@role': [Boolean, Expression, Literal, Primitive, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 797, + line: 28, + col: 38, + }, + end: { '@type': "uast:Position", + offset: 802, + line: 28, + col: 43, + }, + }, + value: false, + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "QualifiedIdentifier", + '@role': [Condition, Expression, Identifier, If, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 700, + line: 26, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 704, + line: 26, + col: 17, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 699, + line: 26, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 703, + line: 26, + col: 16, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 699, + line: 26, + col: 12, + }, + }, + Name: "context_preserved", + }, + ], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 811, + line: 29, + col: 9, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 811, + line: 29, + col: 9, + }, + }, + ctx: "Store", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 869, + line: 30, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 894, + line: 30, + col: 39, + }, + }, + Format: "", + Value: "flask._preserve_context", + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 811, + line: 29, + col: 9, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 829, + line: 29, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 848, + line: 29, + col: 46, + }, + }, + Format: "", + Value: "environ_overrides", + }, + { '@type': "Dict", + '@role': [Argument, Call, Expression, Function, Literal, Map, Name, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 850, + line: 29, + col: 48, + }, + }, + keys: [], + values: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 812, + line: 29, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 818, + line: 29, + col: 16, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 811, + line: 29, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 817, + line: 29, + col: 15, + }, + }, + Name: "kwargs", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 811, + line: 29, + col: 9, + }, + }, + Name: "setdefault", + }, + ], + }, + keywords: [], + }, + }, + ], + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 899, + line: 30, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 903, + line: 30, + col: 48, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 898, + line: 30, + col: 43, + }, + end: { '@type': "uast:Position", + offset: 902, + line: 30, + col: 47, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 898, + line: 30, + col: 43, + }, + }, + Name: "preserve_context", + }, + ], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 928, + line: 31, + col: 9, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 928, + line: 31, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 931, + line: 31, + col: 12, + }, + }, + Name: "old", + }, + ], + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 935, + line: 31, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 953, + line: 31, + col: 34, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 934, + line: 31, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 952, + line: 31, + col: 33, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 934, + line: 31, + col: 15, + }, + }, + Name: "top", + }, + ], + }, + }, + { '@type': "Try", + '@token': "try", + '@role': [Statement, Try], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 965, + line: 32, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 968, + line: 32, + col: 12, + }, + }, + body: { '@type': "Try.body", + '@role': [Body, Try], + 'body_stmts': [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 982, + line: 33, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 988, + line: 33, + col: 19, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 989, + line: 33, + col: 20, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1001, + line: 33, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 1005, + line: 33, + col: 36, + }, + }, + Name: "self", + }, + { '@type': "Starred", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1007, + line: 33, + col: 38, + }, + }, + ctx: "Load", + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1008, + line: 33, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 1012, + line: 33, + col: 43, + }, + }, + Name: "args", + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 990, + line: 33, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 996, + line: 33, + col: 27, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 989, + line: 33, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 995, + line: 33, + col: 26, + }, + }, + Name: "Client", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 989, + line: 33, + col: 20, + }, + }, + Name: "open", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: ~, + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1016, + line: 33, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 1022, + line: 33, + col: 53, + }, + }, + Name: "kwargs", + }, + }, + ], + }, + }, + ], + }, + finalbody: { '@type': "Try.finalbody", + '@token': "finally", + '@role': [Finally, Try], + 'final_stmts': [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1053, + line: 35, + col: 13, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1054, + line: 35, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 1058, + line: 35, + col: 18, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1053, + line: 35, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1057, + line: 35, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1053, + line: 35, + col: 13, + }, + }, + Name: "context_preserved", + }, + ], + }, + ], + value: { '@type': "Compare", + '@role': [Binary, Condition, Expression, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1078, + line: 35, + col: 38, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1108, + line: 35, + col: 68, + }, + end: { '@type': "uast:Position", + offset: 1111, + line: 35, + col: 71, + }, + }, + Name: "old", + }, + ], + }, + left: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1079, + line: 35, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 1097, + line: 35, + col: 57, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1078, + line: 35, + col: 38, + }, + end: { '@type': "uast:Position", + offset: 1096, + line: 35, + col: 56, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1078, + line: 35, + col: 38, + }, + }, + Name: "top", + }, + ], + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "IsNot", + '@token': "is not", + '@role': [Identical, Not, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + ], + }, + handlers: { '@type': "Try.handlers", + '@token': "except", + '@role': [Catch, Try], + handlers: [], + }, + orelse: { '@type': "Try.else", + '@token': "else", + '@role': [Else, Try], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 664, + line: 25, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 668, + line: 25, + col: 18, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 664, + line: 25, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 668, + line: 25, + col: 18, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 679, + line: 25, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 685, + line: 25, + col: 35, + }, + }, + Init: ~, + MapVariadic: true, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 679, + line: 25, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 685, + line: 25, + col: 35, + }, + }, + Name: "kwargs", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 671, + line: 25, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 675, + line: 25, + col: 25, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 671, + line: 25, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 675, + line: 25, + col: 25, + }, + }, + Name: "args", + }, + Receiver: false, + Type: ~, + Variadic: true, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1121, + line: 37, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1130, + line: 37, + col: 18, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "__enter__", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1146, + line: 38, + col: 9, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1147, + line: 38, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 1151, + line: 38, + col: 14, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1146, + line: 38, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1150, + line: 38, + col: 13, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1146, + line: 38, + col: 9, + }, + }, + Name: "preserve_context", + }, + ], + }, + ], + value: { '@type': "BoolLiteral", + '@token': "True", + '@role': [Boolean, Expression, Literal, Primitive, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1170, + line: 38, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 1174, + line: 38, + col: 37, + }, + }, + value: true, + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1183, + line: 39, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1189, + line: 39, + col: 15, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1190, + line: 39, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 1194, + line: 39, + col: 20, + }, + }, + Name: "self", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1131, + line: 37, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 1135, + line: 37, + col: 23, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1131, + line: 37, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 1135, + line: 37, + col: 23, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1204, + line: 41, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1212, + line: 41, + col: 17, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "__exit__", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1253, + line: 42, + col: 9, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1254, + line: 42, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 1258, + line: 42, + col: 14, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1253, + line: 42, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1257, + line: 42, + col: 13, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1253, + line: 42, + col: 9, + }, + }, + Name: "preserve_context", + }, + ], + }, + ], + value: { '@type': "BoolLiteral", + '@token': "False", + '@role': [Boolean, Expression, Literal, Primitive, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1277, + line: 42, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 1282, + line: 42, + col: 38, + }, + }, + value: false, + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1291, + line: 43, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1293, + line: 43, + col: 11, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1330, + line: 44, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1330, + line: 44, + col: 13, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1331, + line: 44, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 1349, + line: 44, + col: 32, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1330, + line: 44, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1348, + line: 44, + col: 31, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1330, + line: 44, + col: 13, + }, + }, + Name: "pop", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "QualifiedIdentifier", + '@role': [Condition, Expression, Identifier, If, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1295, + line: 43, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1299, + line: 43, + col: 17, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1294, + line: 43, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 1298, + line: 43, + col: 16, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1294, + line: 43, + col: 12, + }, + }, + Name: "context_preserved", + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1213, + line: 41, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 1217, + line: 41, + col: 22, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1213, + line: 41, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 1217, + line: 41, + col: 22, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1219, + line: 41, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 1227, + line: 41, + col: 32, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1219, + line: 41, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 1227, + line: 41, + col: 32, + }, + }, + Name: "exc_type", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1229, + line: 41, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 1238, + line: 41, + col: 43, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1229, + line: 41, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 1238, + line: 41, + col: 43, + }, + }, + Name: "exc_value", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1240, + line: 41, + col: 45, + }, + end: { '@type': "uast:Position", + offset: 1242, + line: 41, + col: 47, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1240, + line: 41, + col: 45, + }, + end: { '@type': "uast:Position", + offset: 1242, + line: 41, + col: 47, + }, + }, + Name: "tb", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_114_src.uast b/uast/diff/testdata/testcase_114_src.uast new file mode 100644 index 00000000..faadd6b4 --- /dev/null +++ b/uast/diff/testdata/testcase_114_src.uast @@ -0,0 +1,1647 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 281, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 284, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask.testing\n ~~~~~~~~~~~~~\n\n Implements test support helpers. This module is lazily imported\n and usually not used in production environments.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 285, + line: 12, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 298, + line: 12, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Client", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 313, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 323, + line: 13, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "ClassDef", + '@token': "FlaskClient", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 358, + line: 16, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 369, + line: 16, + col: 18, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 370, + line: 16, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 376, + line: 16, + col: 25, + }, + }, + Name: "Client", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 384, + line: 18, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 384, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 400, + line: 18, + col: 21, + }, + }, + Name: "preserve_context", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 403, + line: 18, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 420, + line: 18, + col: 41, + }, + }, + Name: "context_preserved", + }, + ], + value: { '@type': "BoolLiteral", + '@token': "False", + '@role': [Boolean, Expression, Literal, Primitive, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 423, + line: 18, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 428, + line: 18, + col: 49, + }, + }, + value: false, + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 438, + line: 20, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 442, + line: 20, + col: 13, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "open", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 475, + line: 21, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 477, + line: 21, + col: 11, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 514, + line: 22, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 514, + line: 22, + col: 13, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 515, + line: 22, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 533, + line: 22, + col: 32, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 514, + line: 22, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 532, + line: 22, + col: 31, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 514, + line: 22, + col: 13, + }, + }, + Name: "pop", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 551, + line: 23, + col: 13, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 552, + line: 23, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 556, + line: 23, + col: 18, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 551, + line: 23, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 555, + line: 23, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 551, + line: 23, + col: 13, + }, + }, + Name: "context_preserved", + }, + ], + }, + ], + value: { '@type': "BoolLiteral", + '@token': "False", + '@role': [Boolean, Expression, Literal, Primitive, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 576, + line: 23, + col: 38, + }, + end: { '@type': "uast:Position", + offset: 581, + line: 23, + col: 43, + }, + }, + value: false, + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "QualifiedIdentifier", + '@role': [Condition, Expression, Identifier, If, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 479, + line: 21, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 483, + line: 21, + col: 17, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 478, + line: 21, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 482, + line: 21, + col: 16, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 478, + line: 21, + col: 12, + }, + }, + Name: "context_preserved", + }, + ], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 590, + line: 24, + col: 9, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 590, + line: 24, + col: 9, + }, + }, + ctx: "Store", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 648, + line: 25, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 673, + line: 25, + col: 39, + }, + }, + Format: "", + Value: "flask._preserve_context", + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 590, + line: 24, + col: 9, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 608, + line: 24, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 627, + line: 24, + col: 46, + }, + }, + Format: "", + Value: "environ_overrides", + }, + { '@type': "Dict", + '@role': [Argument, Call, Expression, Function, Literal, Map, Name, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 629, + line: 24, + col: 48, + }, + }, + keys: [], + values: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 591, + line: 24, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 597, + line: 24, + col: 16, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 590, + line: 24, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 596, + line: 24, + col: 15, + }, + }, + Name: "kwargs", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 590, + line: 24, + col: 9, + }, + }, + Name: "setdefault", + }, + ], + }, + keywords: [], + }, + }, + ], + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 678, + line: 25, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 682, + line: 25, + col: 48, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 677, + line: 25, + col: 43, + }, + end: { '@type': "uast:Position", + offset: 681, + line: 25, + col: 47, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 677, + line: 25, + col: 43, + }, + }, + Name: "preserve_context", + }, + ], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 707, + line: 26, + col: 9, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 707, + line: 26, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 710, + line: 26, + col: 12, + }, + }, + Name: "old", + }, + ], + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 714, + line: 26, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 732, + line: 26, + col: 34, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 713, + line: 26, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 731, + line: 26, + col: 33, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 713, + line: 26, + col: 15, + }, + }, + Name: "top", + }, + ], + }, + }, + { '@type': "Try", + '@token': "try", + '@role': [Statement, Try], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 744, + line: 27, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 747, + line: 27, + col: 12, + }, + }, + body: { '@type': "Try.body", + '@role': [Body, Try], + 'body_stmts': [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 761, + line: 28, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 767, + line: 28, + col: 19, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 768, + line: 28, + col: 20, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 780, + line: 28, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 784, + line: 28, + col: 36, + }, + }, + Name: "self", + }, + { '@type': "Starred", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 786, + line: 28, + col: 38, + }, + }, + ctx: "Load", + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 787, + line: 28, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 791, + line: 28, + col: 43, + }, + }, + Name: "args", + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 769, + line: 28, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 775, + line: 28, + col: 27, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 768, + line: 28, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 774, + line: 28, + col: 26, + }, + }, + Name: "Client", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 768, + line: 28, + col: 20, + }, + }, + Name: "open", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: ~, + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 795, + line: 28, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 801, + line: 28, + col: 53, + }, + }, + Name: "kwargs", + }, + }, + ], + }, + }, + ], + }, + finalbody: { '@type': "Try.finalbody", + '@token': "finally", + '@role': [Finally, Try], + 'final_stmts': [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 832, + line: 30, + col: 13, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 833, + line: 30, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 837, + line: 30, + col: 18, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 832, + line: 30, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 836, + line: 30, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 832, + line: 30, + col: 13, + }, + }, + Name: "context_preserved", + }, + ], + }, + ], + value: { '@type': "Compare", + '@role': [Binary, Condition, Expression, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 857, + line: 30, + col: 38, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 887, + line: 30, + col: 68, + }, + end: { '@type': "uast:Position", + offset: 890, + line: 30, + col: 71, + }, + }, + Name: "old", + }, + ], + }, + left: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 858, + line: 30, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 876, + line: 30, + col: 57, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 857, + line: 30, + col: 38, + }, + end: { '@type': "uast:Position", + offset: 875, + line: 30, + col: 56, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 857, + line: 30, + col: 38, + }, + }, + Name: "top", + }, + ], + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "IsNot", + '@token': "is not", + '@role': [Identical, Not, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + ], + }, + handlers: { '@type': "Try.handlers", + '@token': "except", + '@role': [Catch, Try], + handlers: [], + }, + orelse: { '@type': "Try.else", + '@token': "else", + '@role': [Else, Try], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 443, + line: 20, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 447, + line: 20, + col: 18, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 443, + line: 20, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 447, + line: 20, + col: 18, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 458, + line: 20, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 464, + line: 20, + col: 35, + }, + }, + Init: ~, + MapVariadic: true, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 458, + line: 20, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 464, + line: 20, + col: 35, + }, + }, + Name: "kwargs", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 450, + line: 20, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 454, + line: 20, + col: 25, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 450, + line: 20, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 454, + line: 20, + col: 25, + }, + }, + Name: "args", + }, + Receiver: false, + Type: ~, + Variadic: true, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 900, + line: 32, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 909, + line: 32, + col: 18, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "__enter__", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 925, + line: 33, + col: 9, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 926, + line: 33, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 930, + line: 33, + col: 14, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 925, + line: 33, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 929, + line: 33, + col: 13, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 925, + line: 33, + col: 9, + }, + }, + Name: "preserve_context", + }, + ], + }, + ], + value: { '@type': "BoolLiteral", + '@token': "True", + '@role': [Boolean, Expression, Literal, Primitive, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 949, + line: 33, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 953, + line: 33, + col: 37, + }, + }, + value: true, + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 962, + line: 34, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 968, + line: 34, + col: 15, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 969, + line: 34, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 973, + line: 34, + col: 20, + }, + }, + Name: "self", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 910, + line: 32, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 914, + line: 32, + col: 23, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 910, + line: 32, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 914, + line: 32, + col: 23, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 983, + line: 36, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 991, + line: 36, + col: 17, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "__exit__", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1032, + line: 37, + col: 9, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1033, + line: 37, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 1037, + line: 37, + col: 14, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1032, + line: 37, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1036, + line: 37, + col: 13, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1032, + line: 37, + col: 9, + }, + }, + Name: "preserve_context", + }, + ], + }, + ], + value: { '@type': "BoolLiteral", + '@token': "False", + '@role': [Boolean, Expression, Literal, Primitive, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1056, + line: 37, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 1061, + line: 37, + col: 38, + }, + }, + value: false, + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1070, + line: 38, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1072, + line: 38, + col: 11, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1109, + line: 39, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1109, + line: 39, + col: 13, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1110, + line: 39, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 1128, + line: 39, + col: 32, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1109, + line: 39, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1127, + line: 39, + col: 31, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1109, + line: 39, + col: 13, + }, + }, + Name: "pop", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "QualifiedIdentifier", + '@role': [Condition, Expression, Identifier, If, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1074, + line: 38, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1078, + line: 38, + col: 17, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1073, + line: 38, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 1077, + line: 38, + col: 16, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1073, + line: 38, + col: 12, + }, + }, + Name: "context_preserved", + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 992, + line: 36, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 996, + line: 36, + col: 22, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 992, + line: 36, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 996, + line: 36, + col: 22, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 998, + line: 36, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 1006, + line: 36, + col: 32, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 998, + line: 36, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 1006, + line: 36, + col: 32, + }, + }, + Name: "exc_type", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1008, + line: 36, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 1017, + line: 36, + col: 43, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1008, + line: 36, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 1017, + line: 36, + col: 43, + }, + }, + Name: "exc_value", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1019, + line: 36, + col: 45, + }, + end: { '@type': "uast:Position", + offset: 1021, + line: 36, + col: 47, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1019, + line: 36, + col: 45, + }, + end: { '@type': "uast:Position", + offset: 1021, + line: 36, + col: 47, + }, + }, + Name: "tb", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_115_dst.uast b/uast/diff/testdata/testcase_115_dst.uast new file mode 100644 index 00000000..824fef1c --- /dev/null +++ b/uast/diff/testdata/testcase_115_dst.uast @@ -0,0 +1,683 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 13, + col: 12, + }, + }, + Name: "__version__", + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 13, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 280, + line: 13, + col: 24, + }, + }, + Format: "", + Value: "0.8-dev", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 399, + line: 17, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 412, + line: 17, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 436, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 447, + line: 18, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 471, + line: 20, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 480, + line: 20, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 513, + line: 21, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 525, + line: 21, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 540, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 553, + line: 22, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 717, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 730, + line: 25, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 791, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 800, + line: 26, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 828, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 840, + line: 27, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 855, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 871, + line: 28, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 889, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 905, + line: 29, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 968, + line: 32, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 981, + line: 32, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1151, + line: 36, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1153, + line: 36, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1174, + line: 37, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1187, + line: 37, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1154, + line: 36, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1168, + line: 36, + col: 18, + }, + }, + Name: "json_available", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1238, + line: 40, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1252, + line: 40, + col: 15, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "SecureCookieSession", + }, + Node: { '@type': "uast:Identifier", + Name: "Session", + }, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../sessions", + }, + Target: ~, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_115_src.uast b/uast/diff/testdata/testcase_115_src.uast new file mode 100644 index 00000000..b14c76c5 --- /dev/null +++ b/uast/diff/testdata/testcase_115_src.uast @@ -0,0 +1,652 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 13, + col: 12, + }, + }, + Name: "__version__", + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 13, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 280, + line: 13, + col: 24, + }, + }, + Format: "", + Value: "0.8-dev", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 399, + line: 17, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 412, + line: 17, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 436, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 447, + line: 18, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 471, + line: 20, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 480, + line: 20, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 513, + line: 21, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 525, + line: 21, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 540, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 553, + line: 22, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 717, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 730, + line: 25, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 791, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 800, + line: 26, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 828, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 840, + line: 27, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 855, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 871, + line: 28, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 889, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 905, + line: 29, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 968, + line: 32, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 981, + line: 32, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1151, + line: 36, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1153, + line: 36, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1174, + line: 37, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1187, + line: 37, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1154, + line: 36, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1168, + line: 36, + col: 18, + }, + }, + Name: "json_available", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_116_dst.uast b/uast/diff/testdata/testcase_116_dst.uast new file mode 100644 index 00000000..1271a617 --- /dev/null +++ b/uast/diff/testdata/testcase_116_dst.uast @@ -0,0 +1,694 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 13, + col: 12, + }, + }, + Name: "__version__", + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 13, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 280, + line: 13, + col: 24, + }, + }, + Format: "", + Value: "0.8-dev", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 399, + line: 17, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.exceptions", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 437, + line: 18, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.utils", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 473, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 484, + line: 19, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 508, + line: 21, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 517, + line: 21, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 550, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 562, + line: 22, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 577, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 590, + line: 23, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 754, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 767, + line: 26, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 828, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 837, + line: 27, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 865, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 877, + line: 28, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 892, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 908, + line: 29, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 926, + line: 30, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 942, + line: 30, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1005, + line: 33, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1018, + line: 33, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1188, + line: 37, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1190, + line: 37, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1211, + line: 38, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1224, + line: 38, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1191, + line: 37, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1205, + line: 37, + col: 18, + }, + }, + Name: "json_available", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1275, + line: 41, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1289, + line: 41, + col: 15, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "SecureCookieSession", + }, + Node: { '@type': "uast:Identifier", + Name: "Session", + }, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../sessions", + }, + Target: ~, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_116_src.uast b/uast/diff/testdata/testcase_116_src.uast new file mode 100644 index 00000000..824fef1c --- /dev/null +++ b/uast/diff/testdata/testcase_116_src.uast @@ -0,0 +1,683 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 13, + col: 12, + }, + }, + Name: "__version__", + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 13, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 280, + line: 13, + col: 24, + }, + }, + Format: "", + Value: "0.8-dev", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 399, + line: 17, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 412, + line: 17, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 436, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 447, + line: 18, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 471, + line: 20, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 480, + line: 20, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 513, + line: 21, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 525, + line: 21, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 540, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 553, + line: 22, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 717, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 730, + line: 25, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 791, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 800, + line: 26, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 828, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 840, + line: 27, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 855, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 871, + line: 28, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 889, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 905, + line: 29, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 968, + line: 32, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 981, + line: 32, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1151, + line: 36, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1153, + line: 36, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1174, + line: 37, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1187, + line: 37, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1154, + line: 36, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1168, + line: 36, + col: 18, + }, + }, + Name: "json_available", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1238, + line: 40, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1252, + line: 40, + col: 15, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "SecureCookieSession", + }, + Node: { '@type': "uast:Identifier", + Name: "Session", + }, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../sessions", + }, + Target: ~, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_117_dst.uast b/uast/diff/testdata/testcase_117_dst.uast new file mode 100644 index 00000000..68a328b4 --- /dev/null +++ b/uast/diff/testdata/testcase_117_dst.uast @@ -0,0 +1,497 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 220, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 223, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n flask.testsuite.deprecations\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n Tests deprecation support.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 225, + line: 12, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flask", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 224, + line: 11, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 224, + line: 11, + col: 1, + }, + }, + lines: [], + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 238, + line: 13, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "unittest", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 254, + line: 14, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "FlaskTestCase", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "catch_warnings", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.testsuite", + }, + Target: ~, + }, + { '@type': "ClassDef", + '@token': "DeprecationsTestCase", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 320, + line: 17, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 340, + line: 17, + col: 27, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 341, + line: 17, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 354, + line: 17, + col: 41, + }, + }, + Name: "FlaskTestCase", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 361, + line: 18, + col: 5, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 361, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 385, + line: 18, + col: 29, + }, + }, + Format: "", + Value: "not used currently", + }, + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 392, + line: 21, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 397, + line: 21, + col: 10, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "suite", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 405, + line: 22, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 405, + line: 22, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 410, + line: 22, + col: 10, + }, + }, + Name: "suite", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 413, + line: 22, + col: 13, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 414, + line: 22, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 422, + line: 22, + col: 22, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 413, + line: 22, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 421, + line: 22, + col: 21, + }, + }, + Name: "unittest", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 413, + line: 22, + col: 13, + }, + }, + Name: "TestSuite", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 438, + line: 23, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 438, + line: 23, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 452, + line: 23, + col: 19, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 471, + line: 23, + col: 38, + }, + end: { '@type': "uast:Position", + offset: 491, + line: 23, + col: 58, + }, + }, + Name: "DeprecationsTestCase", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 453, + line: 23, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 461, + line: 23, + col: 28, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 452, + line: 23, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 460, + line: 23, + col: 27, + }, + }, + Name: "unittest", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 452, + line: 23, + col: 19, + }, + }, + Name: "makeSuite", + }, + ], + }, + keywords: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 439, + line: 23, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 444, + line: 23, + col: 11, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 438, + line: 23, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 443, + line: 23, + col: 10, + }, + }, + Name: "suite", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 438, + line: 23, + col: 5, + }, + }, + Name: "addTest", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 498, + line: 24, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 504, + line: 24, + col: 11, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 505, + line: 24, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 510, + line: 24, + col: 17, + }, + }, + Name: "suite", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_117_src.uast b/uast/diff/testdata/testcase_117_src.uast new file mode 100644 index 00000000..2d1e7128 --- /dev/null +++ b/uast/diff/testdata/testcase_117_src.uast @@ -0,0 +1,1719 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 220, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 223, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n flask.testsuite.deprecations\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n Tests deprecation support.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 225, + line: 12, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 240, + line: 12, + col: 16, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "with_statement", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "__future__", + }, + Target: ~, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 264, + line: 14, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flask", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 263, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 263, + line: 13, + col: 1, + }, + }, + lines: [], + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 277, + line: 15, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "unittest", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 293, + line: 16, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "FlaskTestCase", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "catch_warnings", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.testsuite", + }, + Target: ~, + }, + { '@type': "ClassDef", + '@token': "DeprecationsTestCase", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 359, + line: 19, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 379, + line: 19, + col: 27, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 380, + line: 19, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 393, + line: 19, + col: 41, + }, + }, + Name: "FlaskTestCase", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 405, + line: 21, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 428, + line: 21, + col: 32, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "test_init_jinja_globals", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "ClassDef", + '@token': "MyFlask", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 450, + line: 22, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 457, + line: 22, + col: 22, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 459, + line: 22, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 464, + line: 22, + col: 29, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 458, + line: 22, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 463, + line: 22, + col: 28, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 458, + line: 22, + col: 23, + }, + }, + Name: "Flask", + }, + ], + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 488, + line: 23, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 506, + line: 23, + col: 35, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "init_jinja_globals", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 530, + line: 24, + col: 17, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 530, + line: 24, + col: 17, + }, + }, + ctx: "Store", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 553, + line: 24, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 558, + line: 24, + col: 45, + }, + }, + Format: "", + Value: "foo", + }, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 531, + line: 24, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 535, + line: 24, + col: 22, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 530, + line: 24, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 534, + line: 24, + col: 21, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 535, + line: 24, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 544, + line: 24, + col: 31, + }, + }, + Name: "jinja_env", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 530, + line: 24, + col: 17, + }, + }, + Name: "globals", + }, + ], + }, + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 562, + line: 24, + col: 49, + }, + end: { '@type': "uast:Position", + offset: 566, + line: 24, + col: 53, + }, + }, + Format: "", + Value: "42", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 507, + line: 23, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 511, + line: 23, + col: 40, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 507, + line: 23, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 511, + line: 23, + col: 40, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "With", + '@token': "with", + '@role': [Block, Scope, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 576, + line: 26, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 580, + line: 26, + col: 13, + }, + }, + body: { '@type': "With.body", + '@role': [Block, Body, Incomplete, Scope], + 'body_stmts': [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 618, + line: 27, + col: 13, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 618, + line: 27, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 621, + line: 27, + col: 16, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 624, + line: 27, + col: 19, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 632, + line: 27, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 640, + line: 27, + col: 35, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 624, + line: 27, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 631, + line: 27, + col: 26, + }, + }, + Name: "MyFlask", + }, + keywords: [], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 654, + line: 28, + col: 13, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "foo", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 709, + line: 30, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 715, + line: 30, + col: 23, + }, + }, + value: { '@type': "Subscript", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 716, + line: 30, + col: 24, + }, + }, + ctx: "Load", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 738, + line: 30, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 743, + line: 30, + col: 51, + }, + }, + Format: "", + Value: "foo", + }, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 717, + line: 30, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 720, + line: 30, + col: 28, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 716, + line: 30, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 719, + line: 30, + col: 27, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 720, + line: 30, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 729, + line: 30, + col: 37, + }, + }, + Name: "jinja_env", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 716, + line: 30, + col: 24, + }, + }, + Name: "globals", + }, + ], + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 758, + line: 32, + col: 13, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 758, + line: 32, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 759, + line: 32, + col: 14, + }, + }, + Name: "c", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 762, + line: 32, + col: 17, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 763, + line: 32, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 766, + line: 32, + col: 21, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 762, + line: 32, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 765, + line: 32, + col: 20, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 762, + line: 32, + col: 17, + }, + }, + Name: "test_client", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 792, + line: 33, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 792, + line: 33, + col: 13, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 811, + line: 33, + col: 32, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 810, + line: 33, + col: 31, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 816, + line: 33, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 819, + line: 33, + col: 40, + }, + }, + Format: "", + Value: "/", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 811, + line: 33, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 812, + line: 33, + col: 33, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 810, + line: 33, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 811, + line: 33, + col: 32, + }, + }, + Name: "c", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 810, + line: 33, + col: 31, + }, + }, + Name: "get", + }, + ], + }, + keywords: [], + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 810, + line: 33, + col: 31, + }, + }, + Name: "data", + }, + ], + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 827, + line: 33, + col: 48, + }, + end: { '@type': "uast:Position", + offset: 831, + line: 33, + col: 52, + }, + }, + Format: "", + Value: "42", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 793, + line: 33, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 797, + line: 33, + col: 18, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 792, + line: 33, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 796, + line: 33, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 792, + line: 33, + col: 13, + }, + }, + Name: "assert_equal", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 845, + line: 34, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 845, + line: 34, + col: 13, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 863, + line: 34, + col: 31, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 867, + line: 34, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 870, + line: 34, + col: 38, + }, + }, + Name: "log", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 863, + line: 34, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 866, + line: 34, + col: 34, + }, + }, + Name: "len", + }, + keywords: [], + }, + { '@type': "Num", + '@token': 1, + '@role': [Argument, Call, Expression, Function, Literal, Name, Number, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 873, + line: 34, + col: 41, + }, + end: { '@type': "uast:Position", + offset: 874, + line: 34, + col: 42, + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 846, + line: 34, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 850, + line: 34, + col: 18, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 845, + line: 34, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 849, + line: 34, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 845, + line: 34, + col: 13, + }, + }, + Name: "assert_equal", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 35, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 35, + col: 13, + }, + }, + args: [ + { '@type': "Compare", + '@role': [Argument, Binary, Call, Condition, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 901, + line: 35, + col: 26, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 925, + line: 35, + col: 50, + }, + }, + args: [ + { '@type': "Subscript", + '@role': [Argument, Call, Expression, Function, Incomplete, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 929, + line: 35, + col: 54, + }, + }, + ctx: "Load", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 936, + line: 35, + col: 61, + }, + end: { '@type': "uast:Position", + offset: 945, + line: 35, + col: 70, + }, + }, + Format: "", + Value: "message", + }, + }, + value: { '@type': "Subscript", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 929, + line: 35, + col: 54, + }, + }, + ctx: "Load", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "Num", + '@token': 0, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 933, + line: 35, + col: 58, + }, + end: { '@type': "uast:Position", + offset: 934, + line: 35, + col: 59, + }, + }, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 929, + line: 35, + col: 54, + }, + end: { '@type': "uast:Position", + offset: 932, + line: 35, + col: 57, + }, + }, + Name: "log", + }, + }, + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 925, + line: 35, + col: 50, + }, + end: { '@type': "uast:Position", + offset: 928, + line: 35, + col: 53, + }, + }, + Name: "str", + }, + keywords: [], + }, + ], + }, + left: { '@type': "uast:String", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 901, + line: 35, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 921, + line: 35, + col: 46, + }, + }, + Format: "", + Value: "init_jinja_globals", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "In", + '@token': "in", + '@role': [Contains, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 889, + line: 35, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 893, + line: 35, + col: 18, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 35, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 892, + line: 35, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 35, + col: 13, + }, + }, + Name: "assert_", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + items: { '@type': "With.items", + '@role': [Block, Incomplete, Scope], + items: [ + { '@type': "withitem", + '@role': [Expression, Identifier, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + 'context_expr': { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 581, + line: 26, + col: 14, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 581, + line: 26, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 595, + line: 26, + col: 28, + }, + }, + Name: "catch_warnings", + }, + keywords: [], + }, + 'optional_vars': { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 601, + line: 26, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 604, + line: 26, + col: 37, + }, + }, + Name: "log", + }, + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 429, + line: 21, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 433, + line: 21, + col: 37, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 429, + line: 21, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 433, + line: 21, + col: 37, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 955, + line: 38, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 960, + line: 38, + col: 10, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "suite", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 968, + line: 39, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 968, + line: 39, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 973, + line: 39, + col: 10, + }, + }, + Name: "suite", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 976, + line: 39, + col: 13, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 977, + line: 39, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 985, + line: 39, + col: 22, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 976, + line: 39, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 984, + line: 39, + col: 21, + }, + }, + Name: "unittest", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 976, + line: 39, + col: 13, + }, + }, + Name: "TestSuite", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1001, + line: 40, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1001, + line: 40, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1015, + line: 40, + col: 19, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1034, + line: 40, + col: 38, + }, + end: { '@type': "uast:Position", + offset: 1054, + line: 40, + col: 58, + }, + }, + Name: "DeprecationsTestCase", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1016, + line: 40, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 1024, + line: 40, + col: 28, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1015, + line: 40, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 1023, + line: 40, + col: 27, + }, + }, + Name: "unittest", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1015, + line: 40, + col: 19, + }, + }, + Name: "makeSuite", + }, + ], + }, + keywords: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1002, + line: 40, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 1007, + line: 40, + col: 11, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1001, + line: 40, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1006, + line: 40, + col: 10, + }, + }, + Name: "suite", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1001, + line: 40, + col: 5, + }, + }, + Name: "addTest", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1061, + line: 41, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1067, + line: 41, + col: 11, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1068, + line: 41, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 1073, + line: 41, + col: 17, + }, + }, + Name: "suite", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_118_dst.uast b/uast/diff/testdata/testcase_118_dst.uast new file mode 100644 index 00000000..1271a617 --- /dev/null +++ b/uast/diff/testdata/testcase_118_dst.uast @@ -0,0 +1,694 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 13, + col: 12, + }, + }, + Name: "__version__", + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 13, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 280, + line: 13, + col: 24, + }, + }, + Format: "", + Value: "0.8-dev", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 399, + line: 17, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.exceptions", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 437, + line: 18, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.utils", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 473, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 484, + line: 19, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 508, + line: 21, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 517, + line: 21, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 550, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 562, + line: 22, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 577, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 590, + line: 23, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 754, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 767, + line: 26, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 828, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 837, + line: 27, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 865, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 877, + line: 28, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 892, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 908, + line: 29, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 926, + line: 30, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 942, + line: 30, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1005, + line: 33, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1018, + line: 33, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1188, + line: 37, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1190, + line: 37, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1211, + line: 38, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1224, + line: 38, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1191, + line: 37, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1205, + line: 37, + col: 18, + }, + }, + Name: "json_available", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1275, + line: 41, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1289, + line: 41, + col: 15, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "SecureCookieSession", + }, + Node: { '@type': "uast:Identifier", + Name: "Session", + }, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../sessions", + }, + Target: ~, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_118_src.uast b/uast/diff/testdata/testcase_118_src.uast new file mode 100644 index 00000000..824fef1c --- /dev/null +++ b/uast/diff/testdata/testcase_118_src.uast @@ -0,0 +1,683 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 13, + col: 12, + }, + }, + Name: "__version__", + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 13, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 280, + line: 13, + col: 24, + }, + }, + Format: "", + Value: "0.8-dev", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 399, + line: 17, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 412, + line: 17, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 436, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 447, + line: 18, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 471, + line: 20, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 480, + line: 20, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 513, + line: 21, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 525, + line: 21, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 540, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 553, + line: 22, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 717, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 730, + line: 25, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 791, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 800, + line: 26, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 828, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 840, + line: 27, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 855, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 871, + line: 28, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 889, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 905, + line: 29, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 968, + line: 32, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 981, + line: 32, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1151, + line: 36, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1153, + line: 36, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1174, + line: 37, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1187, + line: 37, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1154, + line: 36, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1168, + line: 36, + col: 18, + }, + }, + Name: "json_available", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1238, + line: 40, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1252, + line: 40, + col: 15, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "SecureCookieSession", + }, + Node: { '@type': "uast:Identifier", + Name: "Session", + }, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../sessions", + }, + Target: ~, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_119_dst.uast b/uast/diff/testdata/testcase_119_dst.uast new file mode 100644 index 00000000..b7d2928b --- /dev/null +++ b/uast/diff/testdata/testcase_119_dst.uast @@ -0,0 +1,694 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 13, + col: 12, + }, + }, + Name: "__version__", + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 13, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 280, + line: 13, + col: 24, + }, + }, + Format: "", + Value: "0.8-dev", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 399, + line: 17, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.exceptions", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 437, + line: 18, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.utils", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 473, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 484, + line: 19, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 508, + line: 21, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 517, + line: 21, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 550, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 562, + line: 22, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 577, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 590, + line: 23, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 754, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 767, + line: 26, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 828, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 837, + line: 27, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 865, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 877, + line: 28, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 892, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 908, + line: 29, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 926, + line: 30, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 942, + line: 30, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1005, + line: 33, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1018, + line: 33, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1188, + line: 37, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1190, + line: 37, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1211, + line: 38, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1224, + line: 38, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1191, + line: 37, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1205, + line: 37, + col: 18, + }, + }, + Name: "json_available", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1275, + line: 41, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1289, + line: 41, + col: 15, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "SecureCookieSession", + }, + Node: { '@type': "uast:Identifier", + Name: "Session", + }, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../sessions", + }, + Target: ~, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_119_src.uast b/uast/diff/testdata/testcase_119_src.uast new file mode 100644 index 00000000..1271a617 --- /dev/null +++ b/uast/diff/testdata/testcase_119_src.uast @@ -0,0 +1,694 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 13, + col: 12, + }, + }, + Name: "__version__", + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 13, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 280, + line: 13, + col: 24, + }, + }, + Format: "", + Value: "0.8-dev", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 399, + line: 17, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.exceptions", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 437, + line: 18, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.utils", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 473, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 484, + line: 19, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 508, + line: 21, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 517, + line: 21, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 550, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 562, + line: 22, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 577, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 590, + line: 23, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 754, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 767, + line: 26, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 828, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 837, + line: 27, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 865, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 877, + line: 28, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 892, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 908, + line: 29, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 926, + line: 30, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 942, + line: 30, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1005, + line: 33, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1018, + line: 33, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1188, + line: 37, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1190, + line: 37, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1211, + line: 38, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1224, + line: 38, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1191, + line: 37, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1205, + line: 37, + col: 18, + }, + }, + Name: "json_available", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1275, + line: 41, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1289, + line: 41, + col: 15, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "SecureCookieSession", + }, + Node: { '@type': "uast:Identifier", + Name: "Session", + }, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../sessions", + }, + Target: ~, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_11_dst.uast b/uast/diff/testdata/testcase_11_dst.uast new file mode 100644 index 00000000..99e9c673 --- /dev/null +++ b/uast/diff/testdata/testcase_11_dst.uast @@ -0,0 +1,317 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "unittest", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 16, + line: 2, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "BetterLoader", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.testsuite", + }, + Target: ~, + }, + { '@type': "TryExcept", + '@role': [Catch, Statement, Try], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 3, + col: 1, + }, + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 66, + line: 4, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 66, + line: 4, + col: 5, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 67, + line: 4, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 75, + line: 4, + col: 14, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 66, + line: 4, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 74, + line: 4, + col: 13, + }, + }, + Name: "unittest", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 66, + line: 4, + col: 5, + }, + }, + Name: "main", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "testLoader", + }, + value: { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 91, + line: 4, + col: 30, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 91, + line: 4, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 103, + line: 4, + col: 42, + }, + }, + Name: "BetterLoader", + }, + keywords: [], + kwargs: ~, + starargs: ~, + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "defaultTest", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 119, + line: 4, + col: 58, + }, + end: { '@type': "uast:Position", + offset: 126, + line: 4, + col: 65, + }, + }, + Format: "", + Value: "suite", + }, + }, + ], + kwargs: ~, + starargs: ~, + }, + }, + ], + handlers: [ + { '@type': "ExceptHandler", + '@role': [Catch, Identifier, Try], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 128, + line: 5, + col: 1, + }, + }, + '@token': { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 146, + line: 5, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 147, + line: 5, + col: 20, + }, + }, + Name: "e", + }, + body: [ + { '@type': "Print", + '@token': "print", + '@role': [Call, Callee, Expression, Function, Identifier], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 153, + line: 6, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 158, + line: 6, + col: 10, + }, + }, + dest: ~, + nl: true, + values: [ + { '@type': "BinOp", + '@role': [Argument, Binary, Call, Expression, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 159, + line: 6, + col: 11, + }, + }, + left: { '@type': "uast:String", + '@role': [Binary, Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 159, + line: 6, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 170, + line: 6, + col: 22, + }, + }, + Format: "", + Value: "Error: %s", + }, + op: { '@type': "Mod", + '@token': "%", + '@role': [Arithmetic, Binary, Module, Operator], + '@pos': { '@type': "uast:Positions", + }, + }, + right: { '@type': "uast:Identifier", + '@role': [Binary, Expression, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 173, + line: 6, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 174, + line: 6, + col: 26, + }, + }, + Name: "e", + }, + }, + ], + }, + ], + type: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 135, + line: 5, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 144, + line: 5, + col: 17, + }, + }, + Name: "Exception", + }, + }, + ], + orelse: [], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_11_src.uast b/uast/diff/testdata/testcase_11_src.uast new file mode 100644 index 00000000..5e167c2e --- /dev/null +++ b/uast/diff/testdata/testcase_11_src.uast @@ -0,0 +1,187 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "unittest", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 16, + line: 2, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "BetterLoader", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.testsuite", + }, + Target: ~, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 3, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 3, + col: 1, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 58, + line: 3, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 66, + line: 3, + col: 10, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 3, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 65, + line: 3, + col: 9, + }, + }, + Name: "unittest", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 3, + col: 1, + }, + }, + Name: "main", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "testLoader", + }, + value: { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 82, + line: 3, + col: 26, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 82, + line: 3, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 94, + line: 3, + col: 38, + }, + }, + Name: "BetterLoader", + }, + keywords: [], + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "defaultTest", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 110, + line: 3, + col: 54, + }, + end: { '@type': "uast:Position", + offset: 117, + line: 3, + col: 61, + }, + }, + Format: "", + Value: "suite", + }, + }, + ], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_120_dst.uast b/uast/diff/testdata/testcase_120_dst.uast new file mode 100644 index 00000000..2d1e7128 --- /dev/null +++ b/uast/diff/testdata/testcase_120_dst.uast @@ -0,0 +1,1719 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 220, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 223, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n flask.testsuite.deprecations\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n Tests deprecation support.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 225, + line: 12, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 240, + line: 12, + col: 16, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "with_statement", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "__future__", + }, + Target: ~, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 264, + line: 14, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flask", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 263, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 263, + line: 13, + col: 1, + }, + }, + lines: [], + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 277, + line: 15, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "unittest", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 293, + line: 16, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "FlaskTestCase", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "catch_warnings", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.testsuite", + }, + Target: ~, + }, + { '@type': "ClassDef", + '@token': "DeprecationsTestCase", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 359, + line: 19, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 379, + line: 19, + col: 27, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 380, + line: 19, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 393, + line: 19, + col: 41, + }, + }, + Name: "FlaskTestCase", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 405, + line: 21, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 428, + line: 21, + col: 32, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "test_init_jinja_globals", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "ClassDef", + '@token': "MyFlask", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 450, + line: 22, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 457, + line: 22, + col: 22, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 459, + line: 22, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 464, + line: 22, + col: 29, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 458, + line: 22, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 463, + line: 22, + col: 28, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 458, + line: 22, + col: 23, + }, + }, + Name: "Flask", + }, + ], + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 488, + line: 23, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 506, + line: 23, + col: 35, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "init_jinja_globals", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 530, + line: 24, + col: 17, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 530, + line: 24, + col: 17, + }, + }, + ctx: "Store", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 553, + line: 24, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 558, + line: 24, + col: 45, + }, + }, + Format: "", + Value: "foo", + }, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 531, + line: 24, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 535, + line: 24, + col: 22, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 530, + line: 24, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 534, + line: 24, + col: 21, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 535, + line: 24, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 544, + line: 24, + col: 31, + }, + }, + Name: "jinja_env", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 530, + line: 24, + col: 17, + }, + }, + Name: "globals", + }, + ], + }, + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 562, + line: 24, + col: 49, + }, + end: { '@type': "uast:Position", + offset: 566, + line: 24, + col: 53, + }, + }, + Format: "", + Value: "42", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 507, + line: 23, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 511, + line: 23, + col: 40, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 507, + line: 23, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 511, + line: 23, + col: 40, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "With", + '@token': "with", + '@role': [Block, Scope, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 576, + line: 26, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 580, + line: 26, + col: 13, + }, + }, + body: { '@type': "With.body", + '@role': [Block, Body, Incomplete, Scope], + 'body_stmts': [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 618, + line: 27, + col: 13, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 618, + line: 27, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 621, + line: 27, + col: 16, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 624, + line: 27, + col: 19, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 632, + line: 27, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 640, + line: 27, + col: 35, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 624, + line: 27, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 631, + line: 27, + col: 26, + }, + }, + Name: "MyFlask", + }, + keywords: [], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 654, + line: 28, + col: 13, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "foo", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 709, + line: 30, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 715, + line: 30, + col: 23, + }, + }, + value: { '@type': "Subscript", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 716, + line: 30, + col: 24, + }, + }, + ctx: "Load", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 738, + line: 30, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 743, + line: 30, + col: 51, + }, + }, + Format: "", + Value: "foo", + }, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 717, + line: 30, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 720, + line: 30, + col: 28, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 716, + line: 30, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 719, + line: 30, + col: 27, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 720, + line: 30, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 729, + line: 30, + col: 37, + }, + }, + Name: "jinja_env", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 716, + line: 30, + col: 24, + }, + }, + Name: "globals", + }, + ], + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 758, + line: 32, + col: 13, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 758, + line: 32, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 759, + line: 32, + col: 14, + }, + }, + Name: "c", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 762, + line: 32, + col: 17, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 763, + line: 32, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 766, + line: 32, + col: 21, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 762, + line: 32, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 765, + line: 32, + col: 20, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 762, + line: 32, + col: 17, + }, + }, + Name: "test_client", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 792, + line: 33, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 792, + line: 33, + col: 13, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 811, + line: 33, + col: 32, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 810, + line: 33, + col: 31, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 816, + line: 33, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 819, + line: 33, + col: 40, + }, + }, + Format: "", + Value: "/", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 811, + line: 33, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 812, + line: 33, + col: 33, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 810, + line: 33, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 811, + line: 33, + col: 32, + }, + }, + Name: "c", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 810, + line: 33, + col: 31, + }, + }, + Name: "get", + }, + ], + }, + keywords: [], + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 810, + line: 33, + col: 31, + }, + }, + Name: "data", + }, + ], + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 827, + line: 33, + col: 48, + }, + end: { '@type': "uast:Position", + offset: 831, + line: 33, + col: 52, + }, + }, + Format: "", + Value: "42", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 793, + line: 33, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 797, + line: 33, + col: 18, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 792, + line: 33, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 796, + line: 33, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 792, + line: 33, + col: 13, + }, + }, + Name: "assert_equal", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 845, + line: 34, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 845, + line: 34, + col: 13, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 863, + line: 34, + col: 31, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 867, + line: 34, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 870, + line: 34, + col: 38, + }, + }, + Name: "log", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 863, + line: 34, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 866, + line: 34, + col: 34, + }, + }, + Name: "len", + }, + keywords: [], + }, + { '@type': "Num", + '@token': 1, + '@role': [Argument, Call, Expression, Function, Literal, Name, Number, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 873, + line: 34, + col: 41, + }, + end: { '@type': "uast:Position", + offset: 874, + line: 34, + col: 42, + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 846, + line: 34, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 850, + line: 34, + col: 18, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 845, + line: 34, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 849, + line: 34, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 845, + line: 34, + col: 13, + }, + }, + Name: "assert_equal", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 35, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 35, + col: 13, + }, + }, + args: [ + { '@type': "Compare", + '@role': [Argument, Binary, Call, Condition, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 901, + line: 35, + col: 26, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 925, + line: 35, + col: 50, + }, + }, + args: [ + { '@type': "Subscript", + '@role': [Argument, Call, Expression, Function, Incomplete, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 929, + line: 35, + col: 54, + }, + }, + ctx: "Load", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 936, + line: 35, + col: 61, + }, + end: { '@type': "uast:Position", + offset: 945, + line: 35, + col: 70, + }, + }, + Format: "", + Value: "message", + }, + }, + value: { '@type': "Subscript", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 929, + line: 35, + col: 54, + }, + }, + ctx: "Load", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "Num", + '@token': 0, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 933, + line: 35, + col: 58, + }, + end: { '@type': "uast:Position", + offset: 934, + line: 35, + col: 59, + }, + }, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 929, + line: 35, + col: 54, + }, + end: { '@type': "uast:Position", + offset: 932, + line: 35, + col: 57, + }, + }, + Name: "log", + }, + }, + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 925, + line: 35, + col: 50, + }, + end: { '@type': "uast:Position", + offset: 928, + line: 35, + col: 53, + }, + }, + Name: "str", + }, + keywords: [], + }, + ], + }, + left: { '@type': "uast:String", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 901, + line: 35, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 921, + line: 35, + col: 46, + }, + }, + Format: "", + Value: "init_jinja_globals", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "In", + '@token': "in", + '@role': [Contains, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 889, + line: 35, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 893, + line: 35, + col: 18, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 35, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 892, + line: 35, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 35, + col: 13, + }, + }, + Name: "assert_", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + items: { '@type': "With.items", + '@role': [Block, Incomplete, Scope], + items: [ + { '@type': "withitem", + '@role': [Expression, Identifier, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + 'context_expr': { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 581, + line: 26, + col: 14, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 581, + line: 26, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 595, + line: 26, + col: 28, + }, + }, + Name: "catch_warnings", + }, + keywords: [], + }, + 'optional_vars': { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 601, + line: 26, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 604, + line: 26, + col: 37, + }, + }, + Name: "log", + }, + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 429, + line: 21, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 433, + line: 21, + col: 37, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 429, + line: 21, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 433, + line: 21, + col: 37, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 955, + line: 38, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 960, + line: 38, + col: 10, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "suite", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 968, + line: 39, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 968, + line: 39, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 973, + line: 39, + col: 10, + }, + }, + Name: "suite", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 976, + line: 39, + col: 13, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 977, + line: 39, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 985, + line: 39, + col: 22, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 976, + line: 39, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 984, + line: 39, + col: 21, + }, + }, + Name: "unittest", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 976, + line: 39, + col: 13, + }, + }, + Name: "TestSuite", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1001, + line: 40, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1001, + line: 40, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1015, + line: 40, + col: 19, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1034, + line: 40, + col: 38, + }, + end: { '@type': "uast:Position", + offset: 1054, + line: 40, + col: 58, + }, + }, + Name: "DeprecationsTestCase", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1016, + line: 40, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 1024, + line: 40, + col: 28, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1015, + line: 40, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 1023, + line: 40, + col: 27, + }, + }, + Name: "unittest", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1015, + line: 40, + col: 19, + }, + }, + Name: "makeSuite", + }, + ], + }, + keywords: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1002, + line: 40, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 1007, + line: 40, + col: 11, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1001, + line: 40, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1006, + line: 40, + col: 10, + }, + }, + Name: "suite", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1001, + line: 40, + col: 5, + }, + }, + Name: "addTest", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1061, + line: 41, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1067, + line: 41, + col: 11, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1068, + line: 41, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 1073, + line: 41, + col: 17, + }, + }, + Name: "suite", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_120_src.uast b/uast/diff/testdata/testcase_120_src.uast new file mode 100644 index 00000000..000a5f08 --- /dev/null +++ b/uast/diff/testdata/testcase_120_src.uast @@ -0,0 +1,1674 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 220, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 223, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n flask.testsuite.deprecations\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n Tests deprecation support.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 224, + line: 11, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flask", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 237, + line: 12, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "unittest", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 253, + line: 13, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "FlaskTestCase", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "catch_warnings", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.testsuite", + }, + Target: ~, + }, + { '@type': "ClassDef", + '@token': "DeprecationsTestCase", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 319, + line: 16, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 339, + line: 16, + col: 27, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 340, + line: 16, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 353, + line: 16, + col: 41, + }, + }, + Name: "FlaskTestCase", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 365, + line: 18, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 388, + line: 18, + col: 32, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "test_init_jinja_globals", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "ClassDef", + '@token': "MyFlask", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 410, + line: 19, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 417, + line: 19, + col: 22, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 419, + line: 19, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 424, + line: 19, + col: 29, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 418, + line: 19, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 423, + line: 19, + col: 28, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 418, + line: 19, + col: 23, + }, + }, + Name: "Flask", + }, + ], + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 448, + line: 20, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 466, + line: 20, + col: 35, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "init_jinja_globals", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 490, + line: 21, + col: 17, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 490, + line: 21, + col: 17, + }, + }, + ctx: "Store", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 513, + line: 21, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 518, + line: 21, + col: 45, + }, + }, + Format: "", + Value: "foo", + }, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 491, + line: 21, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 495, + line: 21, + col: 22, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 490, + line: 21, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 494, + line: 21, + col: 21, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 495, + line: 21, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 504, + line: 21, + col: 31, + }, + }, + Name: "jinja_env", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 490, + line: 21, + col: 17, + }, + }, + Name: "globals", + }, + ], + }, + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 522, + line: 21, + col: 49, + }, + end: { '@type': "uast:Position", + offset: 526, + line: 21, + col: 53, + }, + }, + Format: "", + Value: "42", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 467, + line: 20, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 471, + line: 20, + col: 40, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 467, + line: 20, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 471, + line: 20, + col: 40, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "With", + '@token': "with", + '@role': [Block, Scope, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 536, + line: 23, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 540, + line: 23, + col: 13, + }, + }, + body: { '@type': "With.body", + '@role': [Block, Body, Incomplete, Scope], + 'body_stmts': [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 578, + line: 24, + col: 13, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 578, + line: 24, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 581, + line: 24, + col: 16, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 584, + line: 24, + col: 19, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 592, + line: 24, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 600, + line: 24, + col: 35, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 584, + line: 24, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 591, + line: 24, + col: 26, + }, + }, + Name: "MyFlask", + }, + keywords: [], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 614, + line: 25, + col: 13, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "foo", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 669, + line: 27, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 675, + line: 27, + col: 23, + }, + }, + value: { '@type': "Subscript", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 676, + line: 27, + col: 24, + }, + }, + ctx: "Load", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 698, + line: 27, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 703, + line: 27, + col: 51, + }, + }, + Format: "", + Value: "foo", + }, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 677, + line: 27, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 680, + line: 27, + col: 28, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 676, + line: 27, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 679, + line: 27, + col: 27, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 680, + line: 27, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 689, + line: 27, + col: 37, + }, + }, + Name: "jinja_env", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 676, + line: 27, + col: 24, + }, + }, + Name: "globals", + }, + ], + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 718, + line: 29, + col: 13, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 718, + line: 29, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 719, + line: 29, + col: 14, + }, + }, + Name: "c", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 722, + line: 29, + col: 17, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 723, + line: 29, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 726, + line: 29, + col: 21, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 722, + line: 29, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 725, + line: 29, + col: 20, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 722, + line: 29, + col: 17, + }, + }, + Name: "test_client", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 752, + line: 30, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 752, + line: 30, + col: 13, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 771, + line: 30, + col: 32, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 770, + line: 30, + col: 31, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 776, + line: 30, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 779, + line: 30, + col: 40, + }, + }, + Format: "", + Value: "/", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 771, + line: 30, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 772, + line: 30, + col: 33, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 770, + line: 30, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 771, + line: 30, + col: 32, + }, + }, + Name: "c", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 770, + line: 30, + col: 31, + }, + }, + Name: "get", + }, + ], + }, + keywords: [], + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 770, + line: 30, + col: 31, + }, + }, + Name: "data", + }, + ], + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 787, + line: 30, + col: 48, + }, + end: { '@type': "uast:Position", + offset: 791, + line: 30, + col: 52, + }, + }, + Format: "", + Value: "42", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 753, + line: 30, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 757, + line: 30, + col: 18, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 752, + line: 30, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 756, + line: 30, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 752, + line: 30, + col: 13, + }, + }, + Name: "assert_equal", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 805, + line: 31, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 805, + line: 31, + col: 13, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 823, + line: 31, + col: 31, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 827, + line: 31, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 830, + line: 31, + col: 38, + }, + }, + Name: "log", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 823, + line: 31, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 826, + line: 31, + col: 34, + }, + }, + Name: "len", + }, + keywords: [], + }, + { '@type': "Num", + '@token': 1, + '@role': [Argument, Call, Expression, Function, Literal, Name, Number, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 833, + line: 31, + col: 41, + }, + end: { '@type': "uast:Position", + offset: 834, + line: 31, + col: 42, + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 806, + line: 31, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 810, + line: 31, + col: 18, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 805, + line: 31, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 809, + line: 31, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 805, + line: 31, + col: 13, + }, + }, + Name: "assert_equal", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 848, + line: 32, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 848, + line: 32, + col: 13, + }, + }, + args: [ + { '@type': "Compare", + '@role': [Argument, Binary, Call, Condition, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 861, + line: 32, + col: 26, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 885, + line: 32, + col: 50, + }, + }, + args: [ + { '@type': "Subscript", + '@role': [Argument, Call, Expression, Function, Incomplete, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 889, + line: 32, + col: 54, + }, + }, + ctx: "Load", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 896, + line: 32, + col: 61, + }, + end: { '@type': "uast:Position", + offset: 905, + line: 32, + col: 70, + }, + }, + Format: "", + Value: "message", + }, + }, + value: { '@type': "Subscript", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 889, + line: 32, + col: 54, + }, + }, + ctx: "Load", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "Num", + '@token': 0, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 893, + line: 32, + col: 58, + }, + end: { '@type': "uast:Position", + offset: 894, + line: 32, + col: 59, + }, + }, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 889, + line: 32, + col: 54, + }, + end: { '@type': "uast:Position", + offset: 892, + line: 32, + col: 57, + }, + }, + Name: "log", + }, + }, + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 885, + line: 32, + col: 50, + }, + end: { '@type': "uast:Position", + offset: 888, + line: 32, + col: 53, + }, + }, + Name: "str", + }, + keywords: [], + }, + ], + }, + left: { '@type': "uast:String", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 861, + line: 32, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 881, + line: 32, + col: 46, + }, + }, + Format: "", + Value: "init_jinja_globals", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "In", + '@token': "in", + '@role': [Contains, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 849, + line: 32, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 853, + line: 32, + col: 18, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 848, + line: 32, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 852, + line: 32, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 848, + line: 32, + col: 13, + }, + }, + Name: "assert_", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + items: { '@type': "With.items", + '@role': [Block, Incomplete, Scope], + items: [ + { '@type': "withitem", + '@role': [Expression, Identifier, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + 'context_expr': { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 541, + line: 23, + col: 14, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 541, + line: 23, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 555, + line: 23, + col: 28, + }, + }, + Name: "catch_warnings", + }, + keywords: [], + }, + 'optional_vars': { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 561, + line: 23, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 564, + line: 23, + col: 37, + }, + }, + Name: "log", + }, + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 389, + line: 18, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 393, + line: 18, + col: 37, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 389, + line: 18, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 393, + line: 18, + col: 37, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 915, + line: 35, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 920, + line: 35, + col: 10, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "suite", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 928, + line: 36, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 928, + line: 36, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 933, + line: 36, + col: 10, + }, + }, + Name: "suite", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 936, + line: 36, + col: 13, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 937, + line: 36, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 945, + line: 36, + col: 22, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 936, + line: 36, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 944, + line: 36, + col: 21, + }, + }, + Name: "unittest", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 936, + line: 36, + col: 13, + }, + }, + Name: "TestSuite", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 961, + line: 37, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 961, + line: 37, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 975, + line: 37, + col: 19, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 994, + line: 37, + col: 38, + }, + end: { '@type': "uast:Position", + offset: 1014, + line: 37, + col: 58, + }, + }, + Name: "DeprecationsTestCase", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 976, + line: 37, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 984, + line: 37, + col: 28, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 975, + line: 37, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 983, + line: 37, + col: 27, + }, + }, + Name: "unittest", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 975, + line: 37, + col: 19, + }, + }, + Name: "makeSuite", + }, + ], + }, + keywords: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 962, + line: 37, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 967, + line: 37, + col: 11, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 961, + line: 37, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 966, + line: 37, + col: 10, + }, + }, + Name: "suite", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 961, + line: 37, + col: 5, + }, + }, + Name: "addTest", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1021, + line: 38, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1027, + line: 38, + col: 11, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1028, + line: 38, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 1033, + line: 38, + col: 17, + }, + }, + Name: "suite", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_121_dst.uast b/uast/diff/testdata/testcase_121_dst.uast new file mode 100644 index 00000000..807bf1ae --- /dev/null +++ b/uast/diff/testdata/testcase_121_dst.uast @@ -0,0 +1,694 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 13, + col: 12, + }, + }, + Name: "__version__", + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 13, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 276, + line: 13, + col: 20, + }, + }, + Format: "", + Value: "0.8", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 395, + line: 17, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.exceptions", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 433, + line: 18, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.utils", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 469, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 480, + line: 19, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 504, + line: 21, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 513, + line: 21, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 546, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 558, + line: 22, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 573, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 586, + line: 23, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 750, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 763, + line: 26, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 824, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 833, + line: 27, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 861, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 873, + line: 28, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 904, + line: 29, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 922, + line: 30, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 938, + line: 30, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1001, + line: 33, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1014, + line: 33, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1184, + line: 37, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1186, + line: 37, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1207, + line: 38, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1220, + line: 38, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1187, + line: 37, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1201, + line: 37, + col: 18, + }, + }, + Name: "json_available", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1271, + line: 41, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1285, + line: 41, + col: 15, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "SecureCookieSession", + }, + Node: { '@type': "uast:Identifier", + Name: "Session", + }, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../sessions", + }, + Target: ~, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_121_src.uast b/uast/diff/testdata/testcase_121_src.uast new file mode 100644 index 00000000..b7d2928b --- /dev/null +++ b/uast/diff/testdata/testcase_121_src.uast @@ -0,0 +1,694 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 13, + col: 12, + }, + }, + Name: "__version__", + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 13, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 280, + line: 13, + col: 24, + }, + }, + Format: "", + Value: "0.8-dev", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 399, + line: 17, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.exceptions", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 437, + line: 18, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.utils", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 473, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 484, + line: 19, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 508, + line: 21, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 517, + line: 21, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 550, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 562, + line: 22, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 577, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 590, + line: 23, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 754, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 767, + line: 26, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 828, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 837, + line: 27, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 865, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 877, + line: 28, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 892, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 908, + line: 29, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 926, + line: 30, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 942, + line: 30, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1005, + line: 33, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1018, + line: 33, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1188, + line: 37, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1190, + line: 37, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1211, + line: 38, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1224, + line: 38, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1191, + line: 37, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1205, + line: 37, + col: 18, + }, + }, + Name: "json_available", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1275, + line: 41, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1289, + line: 41, + col: 15, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "SecureCookieSession", + }, + Node: { '@type': "uast:Identifier", + Name: "Session", + }, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../sessions", + }, + Target: ~, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_122_dst.uast b/uast/diff/testdata/testcase_122_dst.uast new file mode 100644 index 00000000..2eeac0e7 --- /dev/null +++ b/uast/diff/testdata/testcase_122_dst.uast @@ -0,0 +1,694 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 13, + col: 12, + }, + }, + Name: "__version__", + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 13, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 280, + line: 13, + col: 24, + }, + }, + Format: "", + Value: "0.9-dev", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 399, + line: 17, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.exceptions", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 437, + line: 18, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.utils", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 473, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 484, + line: 19, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 508, + line: 21, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 517, + line: 21, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 550, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 562, + line: 22, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 577, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 590, + line: 23, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 754, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 767, + line: 26, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 828, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 837, + line: 27, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 865, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 877, + line: 28, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 892, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 908, + line: 29, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 926, + line: 30, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 942, + line: 30, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1005, + line: 33, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1018, + line: 33, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1188, + line: 37, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1190, + line: 37, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1211, + line: 38, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1224, + line: 38, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1191, + line: 37, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1205, + line: 37, + col: 18, + }, + }, + Name: "json_available", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1275, + line: 41, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1289, + line: 41, + col: 15, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "SecureCookieSession", + }, + Node: { '@type': "uast:Identifier", + Name: "Session", + }, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../sessions", + }, + Target: ~, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_122_src.uast b/uast/diff/testdata/testcase_122_src.uast new file mode 100644 index 00000000..807bf1ae --- /dev/null +++ b/uast/diff/testdata/testcase_122_src.uast @@ -0,0 +1,694 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 13, + col: 12, + }, + }, + Name: "__version__", + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 13, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 276, + line: 13, + col: 20, + }, + }, + Format: "", + Value: "0.8", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 395, + line: 17, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.exceptions", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 433, + line: 18, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.utils", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 469, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 480, + line: 19, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 504, + line: 21, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 513, + line: 21, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 546, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 558, + line: 22, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 573, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 586, + line: 23, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 750, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 763, + line: 26, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 824, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 833, + line: 27, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 861, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 873, + line: 28, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 904, + line: 29, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 922, + line: 30, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 938, + line: 30, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1001, + line: 33, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1014, + line: 33, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1184, + line: 37, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1186, + line: 37, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1207, + line: 38, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1220, + line: 38, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1187, + line: 37, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1201, + line: 37, + col: 18, + }, + }, + Name: "json_available", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1271, + line: 41, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1285, + line: 41, + col: 15, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "SecureCookieSession", + }, + Node: { '@type': "uast:Identifier", + Name: "Session", + }, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../sessions", + }, + Target: ~, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_123_dst.uast b/uast/diff/testdata/testcase_123_dst.uast new file mode 100644 index 00000000..58257bff --- /dev/null +++ b/uast/diff/testdata/testcase_123_dst.uast @@ -0,0 +1,702 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 13, + col: 12, + }, + }, + Name: "__version__", + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 13, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 280, + line: 13, + col: 24, + }, + }, + Format: "", + Value: "0.9-dev", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 399, + line: 17, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.exceptions", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 437, + line: 18, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.utils", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 473, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 484, + line: 19, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 508, + line: 21, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 517, + line: 21, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 550, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 562, + line: 22, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 577, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 590, + line: 23, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 754, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 767, + line: 26, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_app_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 851, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 860, + line: 28, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 900, + line: 29, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 915, + line: 30, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 931, + line: 30, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 949, + line: 31, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 965, + line: 31, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1028, + line: 34, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1041, + line: 34, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1211, + line: 38, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1213, + line: 38, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1234, + line: 39, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1247, + line: 39, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1214, + line: 38, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1228, + line: 38, + col: 18, + }, + }, + Name: "json_available", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1298, + line: 42, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1312, + line: 42, + col: 15, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "SecureCookieSession", + }, + Node: { '@type': "uast:Identifier", + Name: "Session", + }, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../sessions", + }, + Target: ~, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_123_src.uast b/uast/diff/testdata/testcase_123_src.uast new file mode 100644 index 00000000..2eeac0e7 --- /dev/null +++ b/uast/diff/testdata/testcase_123_src.uast @@ -0,0 +1,694 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 13, + col: 12, + }, + }, + Name: "__version__", + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 13, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 280, + line: 13, + col: 24, + }, + }, + Format: "", + Value: "0.9-dev", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 399, + line: 17, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.exceptions", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 437, + line: 18, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.utils", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 473, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 484, + line: 19, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 508, + line: 21, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 517, + line: 21, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 550, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 562, + line: 22, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 577, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 590, + line: 23, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 754, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 767, + line: 26, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 828, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 837, + line: 27, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 865, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 877, + line: 28, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 892, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 908, + line: 29, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 926, + line: 30, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 942, + line: 30, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1005, + line: 33, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1018, + line: 33, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1188, + line: 37, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1190, + line: 37, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1211, + line: 38, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1224, + line: 38, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1191, + line: 37, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1205, + line: 37, + col: 18, + }, + }, + Name: "json_available", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1275, + line: 41, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1289, + line: 41, + col: 15, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "SecureCookieSession", + }, + Node: { '@type': "uast:Identifier", + Name: "Session", + }, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../sessions", + }, + Target: ~, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_124_dst.uast b/uast/diff/testdata/testcase_124_dst.uast new file mode 100644 index 00000000..24e002f6 --- /dev/null +++ b/uast/diff/testdata/testcase_124_dst.uast @@ -0,0 +1,1482 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 215, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 218, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n flask.module\n ~~~~~~~~~~~~\n\n Implements a class that represents module blueprints.\n\n :copyright: (c) 2014 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 220, + line: 12, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "os", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 219, + line: 11, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 219, + line: 11, + col: 1, + }, + }, + lines: [], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 231, + line: 14, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 247, + line: 14, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 290, + line: 17, + col: 24, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "blueprint_is_module", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 300, + line: 18, + col: 5, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 300, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 358, + line: 18, + col: 63, + }, + }, + Format: "", + Value: "Used to figure out if something is actually a module", + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 363, + line: 19, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 369, + line: 19, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 370, + line: 19, + col: 12, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 381, + line: 19, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 383, + line: 19, + col: 25, + }, + }, + Name: "bp", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 385, + line: 19, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 391, + line: 19, + col: 33, + }, + }, + Name: "Module", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 370, + line: 19, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 380, + line: 19, + col: 22, + }, + }, + Name: "isinstance", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 291, + line: 17, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 293, + line: 17, + col: 27, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 291, + line: 17, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 293, + line: 17, + col: 27, + }, + }, + Name: "bp", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "ClassDef", + '@token': "Module", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 401, + line: 22, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 407, + line: 22, + col: 13, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 408, + line: 22, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 417, + line: 22, + col: 23, + }, + }, + Name: "Blueprint", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 780, + line: 30, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 424, + line: 23, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 787, + line: 30, + col: 8, + }, + }, + Format: "", + Value: "Deprecated module support. Until Flask 0.6 modules were a different\n name of the concept now available as blueprints in Flask. They are\n essentially doing the same but have some bad semantics for templates and\n static files that were fixed with blueprints.\n\n .. versionchanged:: 0.7\n Modules were deprecated in favor for blueprints.\n ", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 797, + line: 32, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 805, + line: 32, + col: 17, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "__init__", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 913, + line: 34, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 915, + line: 34, + col: 11, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 942, + line: 35, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 948, + line: 35, + col: 19, + }, + }, + msg: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 969, + line: 35, + col: 40, + }, + }, + Format: "", + Value: "name required if package name does not point to a submodule", + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 949, + line: 35, + col: 20, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 956, + line: 35, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 967, + line: 35, + col: 38, + }, + }, + Name: "import_name", + }, + ], + }, + left: { '@type': "uast:String", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 949, + line: 35, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 952, + line: 35, + col: 23, + }, + }, + Format: "", + Value: ".", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "In", + '@token': "in", + '@role': [Contains, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1064, + line: 37, + col: 13, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1064, + line: 37, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1068, + line: 37, + col: 17, + }, + }, + Name: "name", + }, + ], + value: { '@type': "Subscript", + '@role': [Expression, Incomplete, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1071, + line: 37, + col: 20, + }, + }, + ctx: "Load", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "Num", + '@token': 1, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1098, + line: 37, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 1099, + line: 37, + col: 48, + }, + }, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1071, + line: 37, + col: 20, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1082, + line: 37, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 1083, + line: 37, + col: 32, + }, + }, + Format: "", + Value: ".", + }, + { '@type': "Num", + '@token': 1, + '@role': [Argument, Call, Expression, Function, Literal, Name, Number, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1095, + line: 37, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 1096, + line: 37, + col: 45, + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1072, + line: 37, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 1083, + line: 37, + col: 32, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1071, + line: 37, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 1082, + line: 37, + col: 31, + }, + }, + Name: "import_name", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1071, + line: 37, + col: 20, + }, + }, + Name: "rsplit", + }, + ], + }, + keywords: [], + }, + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 916, + line: 34, + col: 12, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 924, + line: 34, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 928, + line: 34, + col: 24, + }, + }, + LiteralValue: "None", + value: ~, + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 916, + line: 34, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 920, + line: 34, + col: 16, + }, + }, + Name: "name", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Is", + '@token': "is", + '@role': [Identical, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1109, + line: 38, + col: 9, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1109, + line: 38, + col: 9, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1128, + line: 38, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 1132, + line: 38, + col: 32, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1134, + line: 38, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 1138, + line: 38, + col: 38, + }, + }, + Name: "name", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1140, + line: 38, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 1151, + line: 38, + col: 51, + }, + }, + Name: "import_name", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1110, + line: 38, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 1119, + line: 38, + col: 19, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1109, + line: 38, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1118, + line: 38, + col: 18, + }, + }, + Name: "Blueprint", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1109, + line: 38, + col: 9, + }, + }, + Name: "__init__", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "url_prefix", + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1153, + line: 38, + col: 53, + }, + end: { '@type': "uast:Position", + offset: 1163, + line: 38, + col: 63, + }, + }, + Name: "url_prefix", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "subdomain", + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1203, + line: 39, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 1212, + line: 39, + col: 37, + }, + }, + Name: "subdomain", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "template_folder", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1240, + line: 39, + col: 65, + }, + end: { '@type': "uast:Position", + offset: 1251, + line: 39, + col: 76, + }, + }, + Format: "", + Value: "templates", + }, + }, + ], + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1262, + line: 41, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1264, + line: 41, + col: 11, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1332, + line: 42, + col: 13, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1333, + line: 42, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 1337, + line: 42, + col: 18, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1332, + line: 42, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1336, + line: 42, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1332, + line: 42, + col: 13, + }, + }, + Name: "_static_folder", + }, + ], + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1354, + line: 42, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 1362, + line: 42, + col: 43, + }, + }, + Format: "", + Value: "static", + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Call", + '@role': [Call, Condition, Expression, Function, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1265, + line: 41, + col: 12, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1279, + line: 41, + col: 26, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1293, + line: 41, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 1297, + line: 41, + col: 44, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1292, + line: 41, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 1296, + line: 41, + col: 43, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1292, + line: 41, + col: 39, + }, + }, + Name: "root_path", + }, + ], + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1308, + line: 41, + col: 55, + }, + end: { '@type': "uast:Position", + offset: 1316, + line: 41, + col: 63, + }, + }, + Format: "", + Value: "static", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1280, + line: 41, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 1282, + line: 41, + col: 29, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1279, + line: 41, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 1281, + line: 41, + col: 28, + }, + }, + Name: "os", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1282, + line: 41, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 1286, + line: 41, + col: 33, + }, + }, + Name: "path", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1279, + line: 41, + col: 26, + }, + }, + Name: "join", + }, + ], + }, + keywords: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1266, + line: 41, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1268, + line: 41, + col: 15, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1265, + line: 41, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 1267, + line: 41, + col: 14, + }, + }, + Name: "os", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1268, + line: 41, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 1272, + line: 41, + col: 19, + }, + }, + Name: "path", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1265, + line: 41, + col: 12, + }, + }, + Name: "isdir", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 806, + line: 32, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 810, + line: 32, + col: 22, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 806, + line: 32, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 810, + line: 32, + col: 22, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 812, + line: 32, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 823, + line: 32, + col: 35, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 812, + line: 32, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 823, + line: 32, + col: 35, + }, + }, + Name: "import_name", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 825, + line: 32, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 829, + line: 32, + col: 41, + }, + }, + Init: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 830, + line: 32, + col: 42, + }, + end: { '@type': "uast:Position", + offset: 834, + line: 32, + col: 46, + }, + }, + LiteralValue: "None", + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 788, + line: 31, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 788, + line: 31, + col: 1, + }, + }, + lines: [], + }, + value: ~, + }, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 825, + line: 32, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 829, + line: 32, + col: 41, + }, + }, + Name: "name", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 836, + line: 32, + col: 48, + }, + end: { '@type': "uast:Position", + offset: 846, + line: 32, + col: 58, + }, + }, + Init: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 847, + line: 32, + col: 59, + }, + end: { '@type': "uast:Position", + offset: 851, + line: 32, + col: 63, + }, + }, + LiteralValue: "None", + value: ~, + }, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 836, + line: 32, + col: 48, + }, + end: { '@type': "uast:Position", + offset: 846, + line: 32, + col: 58, + }, + }, + Name: "url_prefix", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 870, + line: 33, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 881, + line: 33, + col: 29, + }, + }, + Init: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 882, + line: 33, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 886, + line: 33, + col: 34, + }, + }, + LiteralValue: "None", + value: ~, + }, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 870, + line: 33, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 881, + line: 33, + col: 29, + }, + }, + Name: "static_path", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 33, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 897, + line: 33, + col: 45, + }, + }, + Init: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 898, + line: 33, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 902, + line: 33, + col: 50, + }, + }, + LiteralValue: "None", + value: ~, + }, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 33, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 897, + line: 33, + col: 45, + }, + }, + Name: "subdomain", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_124_src.uast b/uast/diff/testdata/testcase_124_src.uast new file mode 100644 index 00000000..b09f4b31 --- /dev/null +++ b/uast/diff/testdata/testcase_124_src.uast @@ -0,0 +1,1482 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 215, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 218, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n flask.module\n ~~~~~~~~~~~~\n\n Implements a class that represents module blueprints.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 220, + line: 12, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "os", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 219, + line: 11, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 219, + line: 11, + col: 1, + }, + }, + lines: [], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 231, + line: 14, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 247, + line: 14, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 290, + line: 17, + col: 24, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "blueprint_is_module", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 300, + line: 18, + col: 5, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 300, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 358, + line: 18, + col: 63, + }, + }, + Format: "", + Value: "Used to figure out if something is actually a module", + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 363, + line: 19, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 369, + line: 19, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 370, + line: 19, + col: 12, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 381, + line: 19, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 383, + line: 19, + col: 25, + }, + }, + Name: "bp", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 385, + line: 19, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 391, + line: 19, + col: 33, + }, + }, + Name: "Module", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 370, + line: 19, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 380, + line: 19, + col: 22, + }, + }, + Name: "isinstance", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 291, + line: 17, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 293, + line: 17, + col: 27, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 291, + line: 17, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 293, + line: 17, + col: 27, + }, + }, + Name: "bp", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "ClassDef", + '@token': "Module", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 401, + line: 22, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 407, + line: 22, + col: 13, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 408, + line: 22, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 417, + line: 22, + col: 23, + }, + }, + Name: "Blueprint", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 780, + line: 30, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 424, + line: 23, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 787, + line: 30, + col: 8, + }, + }, + Format: "", + Value: "Deprecated module support. Until Flask 0.6 modules were a different\n name of the concept now available as blueprints in Flask. They are\n essentially doing the same but have some bad semantics for templates and\n static files that were fixed with blueprints.\n\n .. versionchanged:: 0.7\n Modules were deprecated in favor for blueprints.\n ", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 797, + line: 32, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 805, + line: 32, + col: 17, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "__init__", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 913, + line: 34, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 915, + line: 34, + col: 11, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 942, + line: 35, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 948, + line: 35, + col: 19, + }, + }, + msg: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 969, + line: 35, + col: 40, + }, + }, + Format: "", + Value: "name required if package name does not point to a submodule", + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 949, + line: 35, + col: 20, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 956, + line: 35, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 967, + line: 35, + col: 38, + }, + }, + Name: "import_name", + }, + ], + }, + left: { '@type': "uast:String", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 949, + line: 35, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 952, + line: 35, + col: 23, + }, + }, + Format: "", + Value: ".", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "In", + '@token': "in", + '@role': [Contains, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1064, + line: 37, + col: 13, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1064, + line: 37, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1068, + line: 37, + col: 17, + }, + }, + Name: "name", + }, + ], + value: { '@type': "Subscript", + '@role': [Expression, Incomplete, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1071, + line: 37, + col: 20, + }, + }, + ctx: "Load", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "Num", + '@token': 1, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1098, + line: 37, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 1099, + line: 37, + col: 48, + }, + }, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1071, + line: 37, + col: 20, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1082, + line: 37, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 1083, + line: 37, + col: 32, + }, + }, + Format: "", + Value: ".", + }, + { '@type': "Num", + '@token': 1, + '@role': [Argument, Call, Expression, Function, Literal, Name, Number, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1095, + line: 37, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 1096, + line: 37, + col: 45, + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1072, + line: 37, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 1083, + line: 37, + col: 32, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1071, + line: 37, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 1082, + line: 37, + col: 31, + }, + }, + Name: "import_name", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1071, + line: 37, + col: 20, + }, + }, + Name: "rsplit", + }, + ], + }, + keywords: [], + }, + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 916, + line: 34, + col: 12, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 924, + line: 34, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 928, + line: 34, + col: 24, + }, + }, + LiteralValue: "None", + value: ~, + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 916, + line: 34, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 920, + line: 34, + col: 16, + }, + }, + Name: "name", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Is", + '@token': "is", + '@role': [Identical, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1109, + line: 38, + col: 9, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1109, + line: 38, + col: 9, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1128, + line: 38, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 1132, + line: 38, + col: 32, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1134, + line: 38, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 1138, + line: 38, + col: 38, + }, + }, + Name: "name", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1140, + line: 38, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 1151, + line: 38, + col: 51, + }, + }, + Name: "import_name", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1110, + line: 38, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 1119, + line: 38, + col: 19, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1109, + line: 38, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1118, + line: 38, + col: 18, + }, + }, + Name: "Blueprint", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1109, + line: 38, + col: 9, + }, + }, + Name: "__init__", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "url_prefix", + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1153, + line: 38, + col: 53, + }, + end: { '@type': "uast:Position", + offset: 1163, + line: 38, + col: 63, + }, + }, + Name: "url_prefix", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "subdomain", + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1203, + line: 39, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 1212, + line: 39, + col: 37, + }, + }, + Name: "subdomain", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "template_folder", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1240, + line: 39, + col: 65, + }, + end: { '@type': "uast:Position", + offset: 1251, + line: 39, + col: 76, + }, + }, + Format: "", + Value: "templates", + }, + }, + ], + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1262, + line: 41, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1264, + line: 41, + col: 11, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1332, + line: 42, + col: 13, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1333, + line: 42, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 1337, + line: 42, + col: 18, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1332, + line: 42, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1336, + line: 42, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1332, + line: 42, + col: 13, + }, + }, + Name: "_static_folder", + }, + ], + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1354, + line: 42, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 1362, + line: 42, + col: 43, + }, + }, + Format: "", + Value: "static", + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Call", + '@role': [Call, Condition, Expression, Function, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1265, + line: 41, + col: 12, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1279, + line: 41, + col: 26, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1293, + line: 41, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 1297, + line: 41, + col: 44, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1292, + line: 41, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 1296, + line: 41, + col: 43, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1292, + line: 41, + col: 39, + }, + }, + Name: "root_path", + }, + ], + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1308, + line: 41, + col: 55, + }, + end: { '@type': "uast:Position", + offset: 1316, + line: 41, + col: 63, + }, + }, + Format: "", + Value: "static", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1280, + line: 41, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 1282, + line: 41, + col: 29, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1279, + line: 41, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 1281, + line: 41, + col: 28, + }, + }, + Name: "os", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1282, + line: 41, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 1286, + line: 41, + col: 33, + }, + }, + Name: "path", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1279, + line: 41, + col: 26, + }, + }, + Name: "join", + }, + ], + }, + keywords: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1266, + line: 41, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1268, + line: 41, + col: 15, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1265, + line: 41, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 1267, + line: 41, + col: 14, + }, + }, + Name: "os", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1268, + line: 41, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 1272, + line: 41, + col: 19, + }, + }, + Name: "path", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1265, + line: 41, + col: 12, + }, + }, + Name: "isdir", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 806, + line: 32, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 810, + line: 32, + col: 22, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 806, + line: 32, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 810, + line: 32, + col: 22, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 812, + line: 32, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 823, + line: 32, + col: 35, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 812, + line: 32, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 823, + line: 32, + col: 35, + }, + }, + Name: "import_name", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 825, + line: 32, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 829, + line: 32, + col: 41, + }, + }, + Init: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 830, + line: 32, + col: 42, + }, + end: { '@type': "uast:Position", + offset: 834, + line: 32, + col: 46, + }, + }, + LiteralValue: "None", + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 788, + line: 31, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 788, + line: 31, + col: 1, + }, + }, + lines: [], + }, + value: ~, + }, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 825, + line: 32, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 829, + line: 32, + col: 41, + }, + }, + Name: "name", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 836, + line: 32, + col: 48, + }, + end: { '@type': "uast:Position", + offset: 846, + line: 32, + col: 58, + }, + }, + Init: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 847, + line: 32, + col: 59, + }, + end: { '@type': "uast:Position", + offset: 851, + line: 32, + col: 63, + }, + }, + LiteralValue: "None", + value: ~, + }, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 836, + line: 32, + col: 48, + }, + end: { '@type': "uast:Position", + offset: 846, + line: 32, + col: 58, + }, + }, + Name: "url_prefix", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 870, + line: 33, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 881, + line: 33, + col: 29, + }, + }, + Init: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 882, + line: 33, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 886, + line: 33, + col: 34, + }, + }, + LiteralValue: "None", + value: ~, + }, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 870, + line: 33, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 881, + line: 33, + col: 29, + }, + }, + Name: "static_path", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 33, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 897, + line: 33, + col: 45, + }, + }, + Init: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 898, + line: 33, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 902, + line: 33, + col: 50, + }, + }, + LiteralValue: "None", + value: ~, + }, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 33, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 897, + line: 33, + col: 45, + }, + }, + Name: "subdomain", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_125_dst.uast b/uast/diff/testdata/testcase_125_dst.uast new file mode 100644 index 00000000..13751a15 --- /dev/null +++ b/uast/diff/testdata/testcase_125_dst.uast @@ -0,0 +1,1448 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 205, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 208, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n flask.logging\n ~~~~~~~~~~~~~\n\n Implements the logging support for Flask.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 210, + line: 12, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 225, + line: 12, + col: 16, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "absolute_import", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "__future__", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 250, + line: 14, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 262, + line: 14, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "getLogger", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "StreamHandler", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Formatter", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Logger", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "DEBUG", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "logging", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 327, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 340, + line: 17, + col: 18, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "create_logger", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 662, + line: 23, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 351, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 669, + line: 23, + col: 8, + }, + }, + Format: "", + Value: "Creates a logger for the given application. This logger works\n similar to a regular Python logger but changes the effective logging\n level based on the application's debug flag. Furthermore this\n function also removes all attached handlers in case there was a\n logger with the log name before.\n ", + }, + }, + { '@type': "ClassDef", + '@token': "DebugLogger", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 681, + line: 25, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 692, + line: 25, + col: 22, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 693, + line: 25, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 699, + line: 25, + col: 29, + }, + }, + Name: "Logger", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 714, + line: 26, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 731, + line: 26, + col: 30, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "getEffectiveLevel", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 748, + line: 27, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 754, + line: 27, + col: 19, + }, + }, + value: { '@type': "IfExp", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 755, + line: 27, + col: 20, + }, + }, + body: { '@type': "uast:Identifier", + '@role': [Body, If, Then], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 755, + line: 27, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 760, + line: 27, + col: 25, + }, + }, + Name: "DEBUG", + }, + orelse: { '@type': "Call", + '@role': [Body, Call, Else, Expression, Function, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 779, + line: 27, + col: 44, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 804, + line: 27, + col: 69, + }, + end: { '@type': "uast:Position", + offset: 805, + line: 27, + col: 70, + }, + }, + Name: "x", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 780, + line: 27, + col: 45, + }, + end: { '@type': "uast:Position", + offset: 786, + line: 27, + col: 51, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 779, + line: 27, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 785, + line: 27, + col: 50, + }, + }, + Name: "Logger", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 779, + line: 27, + col: 44, + }, + }, + Name: "getEffectiveLevel", + }, + ], + }, + keywords: [], + }, + test: { '@type': "QualifiedIdentifier", + '@role': [Condition, Expression, Identifier, If, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 765, + line: 27, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 768, + line: 27, + col: 33, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 764, + line: 27, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 767, + line: 27, + col: 32, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 764, + line: 27, + col: 29, + }, + }, + Name: "debug", + }, + ], + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 732, + line: 26, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 733, + line: 26, + col: 32, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 732, + line: 26, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 733, + line: 26, + col: 32, + }, + }, + Name: "x", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "ClassDef", + '@token': "DebugHandler", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 818, + line: 29, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 830, + line: 29, + col: 23, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 831, + line: 29, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 844, + line: 29, + col: 37, + }, + }, + Name: "StreamHandler", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 859, + line: 30, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 863, + line: 30, + col: 17, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "emit", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 31, + col: 13, + }, + }, + value: { '@type': "IfExp", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 31, + col: 13, + }, + }, + body: { '@type': "Call", + '@role': [Body, Call, Expression, Function, If, Then], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 31, + col: 13, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 907, + line: 31, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 908, + line: 31, + col: 33, + }, + }, + Name: "x", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 910, + line: 31, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 916, + line: 31, + col: 41, + }, + }, + Name: "record", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 889, + line: 31, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 902, + line: 31, + col: 27, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 31, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 901, + line: 31, + col: 26, + }, + }, + Name: "StreamHandler", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 31, + col: 13, + }, + }, + Name: "emit", + }, + ], + }, + keywords: [], + }, + orelse: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Body, Else, Expression, If, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 936, + line: 31, + col: 61, + }, + end: { '@type': "uast:Position", + offset: 940, + line: 31, + col: 65, + }, + }, + LiteralValue: "None", + value: ~, + }, + test: { '@type': "QualifiedIdentifier", + '@role': [Condition, Expression, Identifier, If, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 922, + line: 31, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 925, + line: 31, + col: 50, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 921, + line: 31, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 924, + line: 31, + col: 49, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 921, + line: 31, + col: 46, + }, + }, + Name: "debug", + }, + ], + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 864, + line: 30, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 865, + line: 30, + col: 19, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 864, + line: 30, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 865, + line: 30, + col: 19, + }, + }, + Name: "x", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 867, + line: 30, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 873, + line: 30, + col: 27, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 867, + line: 30, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 873, + line: 30, + col: 27, + }, + }, + Name: "record", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 946, + line: 33, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 946, + line: 33, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 953, + line: 33, + col: 12, + }, + }, + Name: "handler", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 956, + line: 33, + col: 15, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 956, + line: 33, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 968, + line: 33, + col: 27, + }, + }, + Name: "DebugHandler", + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 975, + line: 34, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 975, + line: 34, + col: 5, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 992, + line: 34, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 997, + line: 34, + col: 27, + }, + }, + Name: "DEBUG", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 976, + line: 34, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 983, + line: 34, + col: 13, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 975, + line: 34, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 982, + line: 34, + col: 12, + }, + }, + Name: "handler", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 975, + line: 34, + col: 5, + }, + }, + Name: "setLevel", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1003, + line: 35, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1003, + line: 35, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1024, + line: 35, + col: 26, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1035, + line: 35, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 1038, + line: 35, + col: 40, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1034, + line: 35, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 1037, + line: 35, + col: 39, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1034, + line: 35, + col: 36, + }, + }, + Name: "debug_log_format", + }, + ], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1024, + line: 35, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 1033, + line: 35, + col: 35, + }, + }, + Name: "Formatter", + }, + keywords: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1004, + line: 35, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 1011, + line: 35, + col: 13, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1003, + line: 35, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1010, + line: 35, + col: 12, + }, + }, + Name: "handler", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1003, + line: 35, + col: 5, + }, + }, + Name: "setFormatter", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1061, + line: 36, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1061, + line: 36, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1067, + line: 36, + col: 11, + }, + }, + Name: "logger", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1070, + line: 36, + col: 14, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1081, + line: 36, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 1084, + line: 36, + col: 28, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1080, + line: 36, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 1083, + line: 36, + col: 27, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1080, + line: 36, + col: 24, + }, + }, + Name: "logger_name", + }, + ], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1070, + line: 36, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 1079, + line: 36, + col: 23, + }, + }, + Name: "getLogger", + }, + keywords: [], + }, + }, + { '@type': "Delete", + '@token': "del", + '@role': [Incomplete, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1205, + line: 39, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1208, + line: 39, + col: 8, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1209, + line: 39, + col: 9, + }, + }, + ctx: "Del", + slice: { '@type': "Slice", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + lower: ~, + step: ~, + upper: ~, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1210, + line: 39, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 1216, + line: 39, + col: 16, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1209, + line: 39, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1215, + line: 39, + col: 15, + }, + }, + Name: "logger", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1209, + line: 39, + col: 9, + }, + }, + Name: "handlers", + }, + ], + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1232, + line: 40, + col: 5, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1233, + line: 40, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 1239, + line: 40, + col: 12, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1232, + line: 40, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1238, + line: 40, + col: 11, + }, + }, + Name: "logger", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1232, + line: 40, + col: 5, + }, + }, + Name: "__class__", + }, + ], + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1251, + line: 40, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 1262, + line: 40, + col: 35, + }, + }, + Name: "DebugLogger", + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1267, + line: 41, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1267, + line: 41, + col: 5, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1285, + line: 41, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 1292, + line: 41, + col: 30, + }, + }, + Name: "handler", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1268, + line: 41, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 1274, + line: 41, + col: 12, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1267, + line: 41, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1273, + line: 41, + col: 11, + }, + }, + Name: "logger", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1267, + line: 41, + col: 5, + }, + }, + Name: "addHandler", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1298, + line: 42, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1304, + line: 42, + col: 11, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1305, + line: 42, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 1311, + line: 42, + col: 18, + }, + }, + Name: "logger", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 341, + line: 17, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 344, + line: 17, + col: 22, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 341, + line: 17, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 344, + line: 17, + col: 22, + }, + }, + Name: "app", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_125_src.uast b/uast/diff/testdata/testcase_125_src.uast new file mode 100644 index 00000000..f998e04f --- /dev/null +++ b/uast/diff/testdata/testcase_125_src.uast @@ -0,0 +1,1448 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 205, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 208, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n flask.logging\n ~~~~~~~~~~~~~\n\n Implements the logging support for Flask.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 210, + line: 12, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 225, + line: 12, + col: 16, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "absolute_import", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "__future__", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 250, + line: 14, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 262, + line: 14, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "getLogger", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "StreamHandler", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Formatter", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Logger", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "DEBUG", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "logging", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 328, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 341, + line: 17, + col: 18, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "create_logger", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 663, + line: 23, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 352, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 670, + line: 23, + col: 8, + }, + }, + Format: "", + Value: "Creates a logger for the given application. This logger works\n similar to a regular Python logger but changes the effective logging\n level based on the application's debug flag. Furthermore this\n function also removes all attached handlers in case there was a\n logger with the log name before.\n ", + }, + }, + { '@type': "ClassDef", + '@token': "DebugLogger", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 682, + line: 25, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 693, + line: 25, + col: 22, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 694, + line: 25, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 700, + line: 25, + col: 29, + }, + }, + Name: "Logger", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 715, + line: 26, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 732, + line: 26, + col: 30, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "getEffectiveLevel", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 749, + line: 27, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 755, + line: 27, + col: 19, + }, + }, + value: { '@type': "IfExp", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 756, + line: 27, + col: 20, + }, + }, + body: { '@type': "uast:Identifier", + '@role': [Body, If, Then], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 756, + line: 27, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 761, + line: 27, + col: 25, + }, + }, + Name: "DEBUG", + }, + orelse: { '@type': "Call", + '@role': [Body, Call, Else, Expression, Function, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 780, + line: 27, + col: 44, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 805, + line: 27, + col: 69, + }, + end: { '@type': "uast:Position", + offset: 806, + line: 27, + col: 70, + }, + }, + Name: "x", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 781, + line: 27, + col: 45, + }, + end: { '@type': "uast:Position", + offset: 787, + line: 27, + col: 51, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 780, + line: 27, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 786, + line: 27, + col: 50, + }, + }, + Name: "Logger", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 780, + line: 27, + col: 44, + }, + }, + Name: "getEffectiveLevel", + }, + ], + }, + keywords: [], + }, + test: { '@type': "QualifiedIdentifier", + '@role': [Condition, Expression, Identifier, If, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 766, + line: 27, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 769, + line: 27, + col: 33, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 765, + line: 27, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 768, + line: 27, + col: 32, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 765, + line: 27, + col: 29, + }, + }, + Name: "debug", + }, + ], + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 733, + line: 26, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 734, + line: 26, + col: 32, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 733, + line: 26, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 734, + line: 26, + col: 32, + }, + }, + Name: "x", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "ClassDef", + '@token': "DebugHandler", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 819, + line: 29, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 831, + line: 29, + col: 23, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 832, + line: 29, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 845, + line: 29, + col: 37, + }, + }, + Name: "StreamHandler", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 860, + line: 30, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 864, + line: 30, + col: 17, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "emit", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 889, + line: 31, + col: 13, + }, + }, + value: { '@type': "IfExp", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 889, + line: 31, + col: 13, + }, + }, + body: { '@type': "Call", + '@role': [Body, Call, Expression, Function, If, Then], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 889, + line: 31, + col: 13, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 908, + line: 31, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 909, + line: 31, + col: 33, + }, + }, + Name: "x", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 911, + line: 31, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 917, + line: 31, + col: 41, + }, + }, + Name: "record", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 890, + line: 31, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 903, + line: 31, + col: 27, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 889, + line: 31, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 902, + line: 31, + col: 26, + }, + }, + Name: "StreamHandler", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 889, + line: 31, + col: 13, + }, + }, + Name: "emit", + }, + ], + }, + keywords: [], + }, + orelse: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Body, Else, Expression, If, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 937, + line: 31, + col: 61, + }, + end: { '@type': "uast:Position", + offset: 941, + line: 31, + col: 65, + }, + }, + LiteralValue: "None", + value: ~, + }, + test: { '@type': "QualifiedIdentifier", + '@role': [Condition, Expression, Identifier, If, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 923, + line: 31, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 926, + line: 31, + col: 50, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 922, + line: 31, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 925, + line: 31, + col: 49, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 922, + line: 31, + col: 46, + }, + }, + Name: "debug", + }, + ], + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 865, + line: 30, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 866, + line: 30, + col: 19, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 865, + line: 30, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 866, + line: 30, + col: 19, + }, + }, + Name: "x", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 868, + line: 30, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 874, + line: 30, + col: 27, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 868, + line: 30, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 874, + line: 30, + col: 27, + }, + }, + Name: "record", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 947, + line: 33, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 947, + line: 33, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 954, + line: 33, + col: 12, + }, + }, + Name: "handler", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 957, + line: 33, + col: 15, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 957, + line: 33, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 969, + line: 33, + col: 27, + }, + }, + Name: "DebugHandler", + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 976, + line: 34, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 976, + line: 34, + col: 5, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 993, + line: 34, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 998, + line: 34, + col: 27, + }, + }, + Name: "DEBUG", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 977, + line: 34, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 984, + line: 34, + col: 13, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 976, + line: 34, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 983, + line: 34, + col: 12, + }, + }, + Name: "handler", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 976, + line: 34, + col: 5, + }, + }, + Name: "setLevel", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1004, + line: 35, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1004, + line: 35, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1025, + line: 35, + col: 26, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1036, + line: 35, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 1039, + line: 35, + col: 40, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1035, + line: 35, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 1038, + line: 35, + col: 39, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1035, + line: 35, + col: 36, + }, + }, + Name: "debug_log_format", + }, + ], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1025, + line: 35, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 1034, + line: 35, + col: 35, + }, + }, + Name: "Formatter", + }, + keywords: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1005, + line: 35, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 1012, + line: 35, + col: 13, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1004, + line: 35, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1011, + line: 35, + col: 12, + }, + }, + Name: "handler", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1004, + line: 35, + col: 5, + }, + }, + Name: "setFormatter", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1062, + line: 36, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1062, + line: 36, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1068, + line: 36, + col: 11, + }, + }, + Name: "logger", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1071, + line: 36, + col: 14, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1082, + line: 36, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 1085, + line: 36, + col: 28, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1081, + line: 36, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 1084, + line: 36, + col: 27, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1081, + line: 36, + col: 24, + }, + }, + Name: "logger_name", + }, + ], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1071, + line: 36, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 1080, + line: 36, + col: 23, + }, + }, + Name: "getLogger", + }, + keywords: [], + }, + }, + { '@type': "Delete", + '@token': "del", + '@role': [Incomplete, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1206, + line: 39, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1209, + line: 39, + col: 8, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1210, + line: 39, + col: 9, + }, + }, + ctx: "Del", + slice: { '@type': "Slice", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + lower: ~, + step: ~, + upper: ~, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1211, + line: 39, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 1217, + line: 39, + col: 16, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1210, + line: 39, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1216, + line: 39, + col: 15, + }, + }, + Name: "logger", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1210, + line: 39, + col: 9, + }, + }, + Name: "handlers", + }, + ], + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1233, + line: 40, + col: 5, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1234, + line: 40, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 1240, + line: 40, + col: 12, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1233, + line: 40, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1239, + line: 40, + col: 11, + }, + }, + Name: "logger", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1233, + line: 40, + col: 5, + }, + }, + Name: "__class__", + }, + ], + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1252, + line: 40, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 1263, + line: 40, + col: 35, + }, + }, + Name: "DebugLogger", + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1268, + line: 41, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1268, + line: 41, + col: 5, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1286, + line: 41, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 1293, + line: 41, + col: 30, + }, + }, + Name: "handler", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1269, + line: 41, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 1275, + line: 41, + col: 12, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1268, + line: 41, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1274, + line: 41, + col: 11, + }, + }, + Name: "logger", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1268, + line: 41, + col: 5, + }, + }, + Name: "addHandler", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1299, + line: 42, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1305, + line: 42, + col: 11, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1306, + line: 42, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 1312, + line: 42, + col: 18, + }, + }, + Name: "logger", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 342, + line: 17, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 345, + line: 17, + col: 22, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 342, + line: 17, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 345, + line: 17, + col: 22, + }, + }, + Name: "app", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_126_dst.uast b/uast/diff/testdata/testcase_126_dst.uast new file mode 100644 index 00000000..914db487 --- /dev/null +++ b/uast/diff/testdata/testcase_126_dst.uast @@ -0,0 +1,1504 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 205, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 208, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n flask.logging\n ~~~~~~~~~~~~~\n\n Implements the logging support for Flask.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 210, + line: 12, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 225, + line: 12, + col: 16, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "absolute_import", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "__future__", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 250, + line: 14, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 262, + line: 14, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "getLogger", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "StreamHandler", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Formatter", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "getLoggerClass", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "DEBUG", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "logging", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 335, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 348, + line: 17, + col: 18, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "create_logger", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 670, + line: 23, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 359, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 677, + line: 23, + col: 8, + }, + }, + Format: "", + Value: "Creates a logger for the given application. This logger works\n similar to a regular Python logger but changes the effective logging\n level based on the application's debug flag. Furthermore this\n function also removes all attached handlers in case there was a\n logger with the log name before.\n ", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 682, + line: 24, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 682, + line: 24, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 688, + line: 24, + col: 11, + }, + }, + Name: "Logger", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 691, + line: 24, + col: 14, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 691, + line: 24, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 705, + line: 24, + col: 28, + }, + }, + Name: "getLoggerClass", + }, + keywords: [], + }, + }, + { '@type': "ClassDef", + '@token': "DebugLogger", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 719, + line: 26, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 730, + line: 26, + col: 22, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 731, + line: 26, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 737, + line: 26, + col: 29, + }, + }, + Name: "Logger", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 752, + line: 27, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 769, + line: 27, + col: 30, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "getEffectiveLevel", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 786, + line: 28, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 792, + line: 28, + col: 19, + }, + }, + value: { '@type': "IfExp", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 793, + line: 28, + col: 20, + }, + }, + body: { '@type': "uast:Identifier", + '@role': [Body, If, Then], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 793, + line: 28, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 798, + line: 28, + col: 25, + }, + }, + Name: "DEBUG", + }, + orelse: { '@type': "Call", + '@role': [Body, Call, Else, Expression, Function, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 817, + line: 28, + col: 44, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 842, + line: 28, + col: 69, + }, + end: { '@type': "uast:Position", + offset: 843, + line: 28, + col: 70, + }, + }, + Name: "x", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 818, + line: 28, + col: 45, + }, + end: { '@type': "uast:Position", + offset: 824, + line: 28, + col: 51, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 817, + line: 28, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 823, + line: 28, + col: 50, + }, + }, + Name: "Logger", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 817, + line: 28, + col: 44, + }, + }, + Name: "getEffectiveLevel", + }, + ], + }, + keywords: [], + }, + test: { '@type': "QualifiedIdentifier", + '@role': [Condition, Expression, Identifier, If, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 803, + line: 28, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 806, + line: 28, + col: 33, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 802, + line: 28, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 805, + line: 28, + col: 32, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 802, + line: 28, + col: 29, + }, + }, + Name: "debug", + }, + ], + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 770, + line: 27, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 771, + line: 27, + col: 32, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 770, + line: 27, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 771, + line: 27, + col: 32, + }, + }, + Name: "x", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "ClassDef", + '@token': "DebugHandler", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 856, + line: 30, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 868, + line: 30, + col: 23, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 869, + line: 30, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 882, + line: 30, + col: 37, + }, + }, + Name: "StreamHandler", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 897, + line: 31, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 901, + line: 31, + col: 17, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "emit", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 926, + line: 32, + col: 13, + }, + }, + value: { '@type': "IfExp", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 926, + line: 32, + col: 13, + }, + }, + body: { '@type': "Call", + '@role': [Body, Call, Expression, Function, If, Then], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 926, + line: 32, + col: 13, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 945, + line: 32, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 946, + line: 32, + col: 33, + }, + }, + Name: "x", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 948, + line: 32, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 954, + line: 32, + col: 41, + }, + }, + Name: "record", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 927, + line: 32, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 940, + line: 32, + col: 27, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 926, + line: 32, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 939, + line: 32, + col: 26, + }, + }, + Name: "StreamHandler", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 926, + line: 32, + col: 13, + }, + }, + Name: "emit", + }, + ], + }, + keywords: [], + }, + orelse: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Body, Else, Expression, If, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 974, + line: 32, + col: 61, + }, + end: { '@type': "uast:Position", + offset: 978, + line: 32, + col: 65, + }, + }, + LiteralValue: "None", + value: ~, + }, + test: { '@type': "QualifiedIdentifier", + '@role': [Condition, Expression, Identifier, If, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 960, + line: 32, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 963, + line: 32, + col: 50, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 959, + line: 32, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 962, + line: 32, + col: 49, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 959, + line: 32, + col: 46, + }, + }, + Name: "debug", + }, + ], + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 902, + line: 31, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 903, + line: 31, + col: 19, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 902, + line: 31, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 903, + line: 31, + col: 19, + }, + }, + Name: "x", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 905, + line: 31, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 911, + line: 31, + col: 27, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 905, + line: 31, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 911, + line: 31, + col: 27, + }, + }, + Name: "record", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 984, + line: 34, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 984, + line: 34, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 991, + line: 34, + col: 12, + }, + }, + Name: "handler", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 994, + line: 34, + col: 15, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 994, + line: 34, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 1006, + line: 34, + col: 27, + }, + }, + Name: "DebugHandler", + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1013, + line: 35, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1013, + line: 35, + col: 5, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1030, + line: 35, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 1035, + line: 35, + col: 27, + }, + }, + Name: "DEBUG", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1014, + line: 35, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 1021, + line: 35, + col: 13, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1013, + line: 35, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1020, + line: 35, + col: 12, + }, + }, + Name: "handler", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1013, + line: 35, + col: 5, + }, + }, + Name: "setLevel", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1041, + line: 36, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1041, + line: 36, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1062, + line: 36, + col: 26, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1073, + line: 36, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 1076, + line: 36, + col: 40, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1072, + line: 36, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 1075, + line: 36, + col: 39, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1072, + line: 36, + col: 36, + }, + }, + Name: "debug_log_format", + }, + ], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1062, + line: 36, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 1071, + line: 36, + col: 35, + }, + }, + Name: "Formatter", + }, + keywords: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1042, + line: 36, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 1049, + line: 36, + col: 13, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1041, + line: 36, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1048, + line: 36, + col: 12, + }, + }, + Name: "handler", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1041, + line: 36, + col: 5, + }, + }, + Name: "setFormatter", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1099, + line: 37, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1099, + line: 37, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1105, + line: 37, + col: 11, + }, + }, + Name: "logger", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1108, + line: 37, + col: 14, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1119, + line: 37, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 1122, + line: 37, + col: 28, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1118, + line: 37, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 1121, + line: 37, + col: 27, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1118, + line: 37, + col: 24, + }, + }, + Name: "logger_name", + }, + ], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1108, + line: 37, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 1117, + line: 37, + col: 23, + }, + }, + Name: "getLogger", + }, + keywords: [], + }, + }, + { '@type': "Delete", + '@token': "del", + '@role': [Incomplete, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1243, + line: 40, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1246, + line: 40, + col: 8, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1247, + line: 40, + col: 9, + }, + }, + ctx: "Del", + slice: { '@type': "Slice", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + lower: ~, + step: ~, + upper: ~, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1248, + line: 40, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 1254, + line: 40, + col: 16, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1247, + line: 40, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1253, + line: 40, + col: 15, + }, + }, + Name: "logger", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1247, + line: 40, + col: 9, + }, + }, + Name: "handlers", + }, + ], + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1270, + line: 41, + col: 5, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1271, + line: 41, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 1277, + line: 41, + col: 12, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1270, + line: 41, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1276, + line: 41, + col: 11, + }, + }, + Name: "logger", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1270, + line: 41, + col: 5, + }, + }, + Name: "__class__", + }, + ], + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1289, + line: 41, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 1300, + line: 41, + col: 35, + }, + }, + Name: "DebugLogger", + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1305, + line: 42, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1305, + line: 42, + col: 5, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1323, + line: 42, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 1330, + line: 42, + col: 30, + }, + }, + Name: "handler", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1306, + line: 42, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 1312, + line: 42, + col: 12, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1305, + line: 42, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1311, + line: 42, + col: 11, + }, + }, + Name: "logger", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1305, + line: 42, + col: 5, + }, + }, + Name: "addHandler", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1336, + line: 43, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1342, + line: 43, + col: 11, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1343, + line: 43, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 1349, + line: 43, + col: 18, + }, + }, + Name: "logger", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 349, + line: 17, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 352, + line: 17, + col: 22, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 349, + line: 17, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 352, + line: 17, + col: 22, + }, + }, + Name: "app", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_126_src.uast b/uast/diff/testdata/testcase_126_src.uast new file mode 100644 index 00000000..13751a15 --- /dev/null +++ b/uast/diff/testdata/testcase_126_src.uast @@ -0,0 +1,1448 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 205, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 208, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n flask.logging\n ~~~~~~~~~~~~~\n\n Implements the logging support for Flask.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 210, + line: 12, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 225, + line: 12, + col: 16, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "absolute_import", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "__future__", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 250, + line: 14, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 262, + line: 14, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "getLogger", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "StreamHandler", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Formatter", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Logger", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "DEBUG", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "logging", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 327, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 340, + line: 17, + col: 18, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "create_logger", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 662, + line: 23, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 351, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 669, + line: 23, + col: 8, + }, + }, + Format: "", + Value: "Creates a logger for the given application. This logger works\n similar to a regular Python logger but changes the effective logging\n level based on the application's debug flag. Furthermore this\n function also removes all attached handlers in case there was a\n logger with the log name before.\n ", + }, + }, + { '@type': "ClassDef", + '@token': "DebugLogger", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 681, + line: 25, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 692, + line: 25, + col: 22, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 693, + line: 25, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 699, + line: 25, + col: 29, + }, + }, + Name: "Logger", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 714, + line: 26, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 731, + line: 26, + col: 30, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "getEffectiveLevel", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 748, + line: 27, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 754, + line: 27, + col: 19, + }, + }, + value: { '@type': "IfExp", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 755, + line: 27, + col: 20, + }, + }, + body: { '@type': "uast:Identifier", + '@role': [Body, If, Then], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 755, + line: 27, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 760, + line: 27, + col: 25, + }, + }, + Name: "DEBUG", + }, + orelse: { '@type': "Call", + '@role': [Body, Call, Else, Expression, Function, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 779, + line: 27, + col: 44, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 804, + line: 27, + col: 69, + }, + end: { '@type': "uast:Position", + offset: 805, + line: 27, + col: 70, + }, + }, + Name: "x", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 780, + line: 27, + col: 45, + }, + end: { '@type': "uast:Position", + offset: 786, + line: 27, + col: 51, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 779, + line: 27, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 785, + line: 27, + col: 50, + }, + }, + Name: "Logger", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 779, + line: 27, + col: 44, + }, + }, + Name: "getEffectiveLevel", + }, + ], + }, + keywords: [], + }, + test: { '@type': "QualifiedIdentifier", + '@role': [Condition, Expression, Identifier, If, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 765, + line: 27, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 768, + line: 27, + col: 33, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 764, + line: 27, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 767, + line: 27, + col: 32, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 764, + line: 27, + col: 29, + }, + }, + Name: "debug", + }, + ], + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 732, + line: 26, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 733, + line: 26, + col: 32, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 732, + line: 26, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 733, + line: 26, + col: 32, + }, + }, + Name: "x", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "ClassDef", + '@token': "DebugHandler", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 818, + line: 29, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 830, + line: 29, + col: 23, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 831, + line: 29, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 844, + line: 29, + col: 37, + }, + }, + Name: "StreamHandler", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 859, + line: 30, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 863, + line: 30, + col: 17, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "emit", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 31, + col: 13, + }, + }, + value: { '@type': "IfExp", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 31, + col: 13, + }, + }, + body: { '@type': "Call", + '@role': [Body, Call, Expression, Function, If, Then], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 31, + col: 13, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 907, + line: 31, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 908, + line: 31, + col: 33, + }, + }, + Name: "x", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 910, + line: 31, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 916, + line: 31, + col: 41, + }, + }, + Name: "record", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 889, + line: 31, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 902, + line: 31, + col: 27, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 31, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 901, + line: 31, + col: 26, + }, + }, + Name: "StreamHandler", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 31, + col: 13, + }, + }, + Name: "emit", + }, + ], + }, + keywords: [], + }, + orelse: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Body, Else, Expression, If, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 936, + line: 31, + col: 61, + }, + end: { '@type': "uast:Position", + offset: 940, + line: 31, + col: 65, + }, + }, + LiteralValue: "None", + value: ~, + }, + test: { '@type': "QualifiedIdentifier", + '@role': [Condition, Expression, Identifier, If, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 922, + line: 31, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 925, + line: 31, + col: 50, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 921, + line: 31, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 924, + line: 31, + col: 49, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 921, + line: 31, + col: 46, + }, + }, + Name: "debug", + }, + ], + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 864, + line: 30, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 865, + line: 30, + col: 19, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 864, + line: 30, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 865, + line: 30, + col: 19, + }, + }, + Name: "x", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 867, + line: 30, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 873, + line: 30, + col: 27, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 867, + line: 30, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 873, + line: 30, + col: 27, + }, + }, + Name: "record", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 946, + line: 33, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 946, + line: 33, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 953, + line: 33, + col: 12, + }, + }, + Name: "handler", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 956, + line: 33, + col: 15, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 956, + line: 33, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 968, + line: 33, + col: 27, + }, + }, + Name: "DebugHandler", + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 975, + line: 34, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 975, + line: 34, + col: 5, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 992, + line: 34, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 997, + line: 34, + col: 27, + }, + }, + Name: "DEBUG", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 976, + line: 34, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 983, + line: 34, + col: 13, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 975, + line: 34, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 982, + line: 34, + col: 12, + }, + }, + Name: "handler", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 975, + line: 34, + col: 5, + }, + }, + Name: "setLevel", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1003, + line: 35, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1003, + line: 35, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1024, + line: 35, + col: 26, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1035, + line: 35, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 1038, + line: 35, + col: 40, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1034, + line: 35, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 1037, + line: 35, + col: 39, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1034, + line: 35, + col: 36, + }, + }, + Name: "debug_log_format", + }, + ], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1024, + line: 35, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 1033, + line: 35, + col: 35, + }, + }, + Name: "Formatter", + }, + keywords: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1004, + line: 35, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 1011, + line: 35, + col: 13, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1003, + line: 35, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1010, + line: 35, + col: 12, + }, + }, + Name: "handler", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1003, + line: 35, + col: 5, + }, + }, + Name: "setFormatter", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1061, + line: 36, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1061, + line: 36, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1067, + line: 36, + col: 11, + }, + }, + Name: "logger", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1070, + line: 36, + col: 14, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1081, + line: 36, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 1084, + line: 36, + col: 28, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1080, + line: 36, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 1083, + line: 36, + col: 27, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1080, + line: 36, + col: 24, + }, + }, + Name: "logger_name", + }, + ], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1070, + line: 36, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 1079, + line: 36, + col: 23, + }, + }, + Name: "getLogger", + }, + keywords: [], + }, + }, + { '@type': "Delete", + '@token': "del", + '@role': [Incomplete, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1205, + line: 39, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1208, + line: 39, + col: 8, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1209, + line: 39, + col: 9, + }, + }, + ctx: "Del", + slice: { '@type': "Slice", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + lower: ~, + step: ~, + upper: ~, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1210, + line: 39, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 1216, + line: 39, + col: 16, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1209, + line: 39, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1215, + line: 39, + col: 15, + }, + }, + Name: "logger", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1209, + line: 39, + col: 9, + }, + }, + Name: "handlers", + }, + ], + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1232, + line: 40, + col: 5, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1233, + line: 40, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 1239, + line: 40, + col: 12, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1232, + line: 40, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1238, + line: 40, + col: 11, + }, + }, + Name: "logger", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1232, + line: 40, + col: 5, + }, + }, + Name: "__class__", + }, + ], + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1251, + line: 40, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 1262, + line: 40, + col: 35, + }, + }, + Name: "DebugLogger", + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1267, + line: 41, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1267, + line: 41, + col: 5, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1285, + line: 41, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 1292, + line: 41, + col: 30, + }, + }, + Name: "handler", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1268, + line: 41, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 1274, + line: 41, + col: 12, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1267, + line: 41, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1273, + line: 41, + col: 11, + }, + }, + Name: "logger", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1267, + line: 41, + col: 5, + }, + }, + Name: "addHandler", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1298, + line: 42, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1304, + line: 42, + col: 11, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1305, + line: 42, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 1311, + line: 42, + col: 18, + }, + }, + Name: "logger", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 341, + line: 17, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 344, + line: 17, + col: 22, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 341, + line: 17, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 344, + line: 17, + col: 22, + }, + }, + Name: "app", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_127_dst.uast b/uast/diff/testdata/testcase_127_dst.uast new file mode 100644 index 00000000..426aa4b3 --- /dev/null +++ b/uast/diff/testdata/testcase_127_dst.uast @@ -0,0 +1,1482 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 215, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 218, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n flask.module\n ~~~~~~~~~~~~\n\n Implements a class that represents module blueprints.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 220, + line: 12, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "os", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 219, + line: 11, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 219, + line: 11, + col: 1, + }, + }, + lines: [], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 231, + line: 14, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 247, + line: 14, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 290, + line: 17, + col: 24, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "blueprint_is_module", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 300, + line: 18, + col: 5, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 300, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 358, + line: 18, + col: 63, + }, + }, + Format: "", + Value: "Used to figure out if something is actually a module", + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 363, + line: 19, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 369, + line: 19, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 370, + line: 19, + col: 12, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 381, + line: 19, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 383, + line: 19, + col: 25, + }, + }, + Name: "bp", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 385, + line: 19, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 391, + line: 19, + col: 33, + }, + }, + Name: "Module", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 370, + line: 19, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 380, + line: 19, + col: 22, + }, + }, + Name: "isinstance", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 291, + line: 17, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 293, + line: 17, + col: 27, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 291, + line: 17, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 293, + line: 17, + col: 27, + }, + }, + Name: "bp", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "ClassDef", + '@token': "Module", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 401, + line: 22, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 407, + line: 22, + col: 13, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 408, + line: 22, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 417, + line: 22, + col: 23, + }, + }, + Name: "Blueprint", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 780, + line: 30, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 424, + line: 23, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 787, + line: 30, + col: 8, + }, + }, + Format: "", + Value: "Deprecated module support. Until Flask 0.6 modules were a different\n name of the concept now available as blueprints in Flask. They are\n essentially doing the same but have some bad semantics for templates and\n static files that were fixed with blueprints.\n\n .. versionchanged:: 0.7\n Modules were deprecated in favor for blueprints.\n ", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 797, + line: 32, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 805, + line: 32, + col: 17, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "__init__", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 913, + line: 34, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 915, + line: 34, + col: 11, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 942, + line: 35, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 948, + line: 35, + col: 19, + }, + }, + msg: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 969, + line: 35, + col: 40, + }, + }, + Format: "", + Value: "name required if package name does not point to a submodule", + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 949, + line: 35, + col: 20, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 956, + line: 35, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 967, + line: 35, + col: 38, + }, + }, + Name: "import_name", + }, + ], + }, + left: { '@type': "uast:String", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 949, + line: 35, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 952, + line: 35, + col: 23, + }, + }, + Format: "", + Value: ".", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "In", + '@token': "in", + '@role': [Contains, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1064, + line: 37, + col: 13, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1064, + line: 37, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1068, + line: 37, + col: 17, + }, + }, + Name: "name", + }, + ], + value: { '@type': "Subscript", + '@role': [Expression, Incomplete, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1071, + line: 37, + col: 20, + }, + }, + ctx: "Load", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "Num", + '@token': 1, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1098, + line: 37, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 1099, + line: 37, + col: 48, + }, + }, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1071, + line: 37, + col: 20, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1082, + line: 37, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 1083, + line: 37, + col: 32, + }, + }, + Format: "", + Value: ".", + }, + { '@type': "Num", + '@token': 1, + '@role': [Argument, Call, Expression, Function, Literal, Name, Number, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1095, + line: 37, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 1096, + line: 37, + col: 45, + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1072, + line: 37, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 1083, + line: 37, + col: 32, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1071, + line: 37, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 1082, + line: 37, + col: 31, + }, + }, + Name: "import_name", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1071, + line: 37, + col: 20, + }, + }, + Name: "rsplit", + }, + ], + }, + keywords: [], + }, + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 916, + line: 34, + col: 12, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 924, + line: 34, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 928, + line: 34, + col: 24, + }, + }, + LiteralValue: "None", + value: ~, + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 916, + line: 34, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 920, + line: 34, + col: 16, + }, + }, + Name: "name", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Is", + '@token': "is", + '@role': [Identical, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1109, + line: 38, + col: 9, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1109, + line: 38, + col: 9, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1128, + line: 38, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 1132, + line: 38, + col: 32, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1134, + line: 38, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 1138, + line: 38, + col: 38, + }, + }, + Name: "name", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1140, + line: 38, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 1151, + line: 38, + col: 51, + }, + }, + Name: "import_name", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1110, + line: 38, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 1119, + line: 38, + col: 19, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1109, + line: 38, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1118, + line: 38, + col: 18, + }, + }, + Name: "Blueprint", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1109, + line: 38, + col: 9, + }, + }, + Name: "__init__", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "url_prefix", + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1153, + line: 38, + col: 53, + }, + end: { '@type': "uast:Position", + offset: 1163, + line: 38, + col: 63, + }, + }, + Name: "url_prefix", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "subdomain", + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1203, + line: 39, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 1212, + line: 39, + col: 37, + }, + }, + Name: "subdomain", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "template_folder", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1240, + line: 39, + col: 65, + }, + end: { '@type': "uast:Position", + offset: 1251, + line: 39, + col: 76, + }, + }, + Format: "", + Value: "templates", + }, + }, + ], + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1262, + line: 41, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1264, + line: 41, + col: 11, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1332, + line: 42, + col: 13, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1333, + line: 42, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 1337, + line: 42, + col: 18, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1332, + line: 42, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1336, + line: 42, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1332, + line: 42, + col: 13, + }, + }, + Name: "_static_folder", + }, + ], + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1354, + line: 42, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 1362, + line: 42, + col: 43, + }, + }, + Format: "", + Value: "static", + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Call", + '@role': [Call, Condition, Expression, Function, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1265, + line: 41, + col: 12, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1279, + line: 41, + col: 26, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1293, + line: 41, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 1297, + line: 41, + col: 44, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1292, + line: 41, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 1296, + line: 41, + col: 43, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1292, + line: 41, + col: 39, + }, + }, + Name: "root_path", + }, + ], + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1308, + line: 41, + col: 55, + }, + end: { '@type': "uast:Position", + offset: 1316, + line: 41, + col: 63, + }, + }, + Format: "", + Value: "static", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1280, + line: 41, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 1282, + line: 41, + col: 29, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1279, + line: 41, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 1281, + line: 41, + col: 28, + }, + }, + Name: "os", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1282, + line: 41, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 1286, + line: 41, + col: 33, + }, + }, + Name: "path", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1279, + line: 41, + col: 26, + }, + }, + Name: "join", + }, + ], + }, + keywords: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1266, + line: 41, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1268, + line: 41, + col: 15, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1265, + line: 41, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 1267, + line: 41, + col: 14, + }, + }, + Name: "os", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1268, + line: 41, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 1272, + line: 41, + col: 19, + }, + }, + Name: "path", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1265, + line: 41, + col: 12, + }, + }, + Name: "isdir", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 806, + line: 32, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 810, + line: 32, + col: 22, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 806, + line: 32, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 810, + line: 32, + col: 22, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 812, + line: 32, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 823, + line: 32, + col: 35, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 812, + line: 32, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 823, + line: 32, + col: 35, + }, + }, + Name: "import_name", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 825, + line: 32, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 829, + line: 32, + col: 41, + }, + }, + Init: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 830, + line: 32, + col: 42, + }, + end: { '@type': "uast:Position", + offset: 834, + line: 32, + col: 46, + }, + }, + LiteralValue: "None", + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 788, + line: 31, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 788, + line: 31, + col: 1, + }, + }, + lines: [], + }, + value: ~, + }, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 825, + line: 32, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 829, + line: 32, + col: 41, + }, + }, + Name: "name", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 836, + line: 32, + col: 48, + }, + end: { '@type': "uast:Position", + offset: 846, + line: 32, + col: 58, + }, + }, + Init: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 847, + line: 32, + col: 59, + }, + end: { '@type': "uast:Position", + offset: 851, + line: 32, + col: 63, + }, + }, + LiteralValue: "None", + value: ~, + }, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 836, + line: 32, + col: 48, + }, + end: { '@type': "uast:Position", + offset: 846, + line: 32, + col: 58, + }, + }, + Name: "url_prefix", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 870, + line: 33, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 881, + line: 33, + col: 29, + }, + }, + Init: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 882, + line: 33, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 886, + line: 33, + col: 34, + }, + }, + LiteralValue: "None", + value: ~, + }, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 870, + line: 33, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 881, + line: 33, + col: 29, + }, + }, + Name: "static_path", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 33, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 897, + line: 33, + col: 45, + }, + }, + Init: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 898, + line: 33, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 902, + line: 33, + col: 50, + }, + }, + LiteralValue: "None", + value: ~, + }, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 33, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 897, + line: 33, + col: 45, + }, + }, + Name: "subdomain", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_127_src.uast b/uast/diff/testdata/testcase_127_src.uast new file mode 100644 index 00000000..fba6d60a --- /dev/null +++ b/uast/diff/testdata/testcase_127_src.uast @@ -0,0 +1,1494 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 215, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 218, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n flask.module\n ~~~~~~~~~~~~\n\n Implements a class that represents module blueprints.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 220, + line: 12, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "os", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 219, + line: 11, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 219, + line: 11, + col: 1, + }, + }, + lines: [], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 231, + line: 14, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 244, + line: 14, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_PackageBoundObject", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_endpoint_from_view_func", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 298, + line: 15, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 314, + line: 15, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 338, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 357, + line: 18, + col: 24, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "blueprint_is_module", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 367, + line: 19, + col: 5, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 367, + line: 19, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 425, + line: 19, + col: 63, + }, + }, + Format: "", + Value: "Used to figure out if something is actually a module", + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 430, + line: 20, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 436, + line: 20, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 437, + line: 20, + col: 12, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 448, + line: 20, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 450, + line: 20, + col: 25, + }, + }, + Name: "bp", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 452, + line: 20, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 458, + line: 20, + col: 33, + }, + }, + Name: "Module", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 437, + line: 20, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 447, + line: 20, + col: 22, + }, + }, + Name: "isinstance", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 358, + line: 18, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 360, + line: 18, + col: 27, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 358, + line: 18, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 360, + line: 18, + col: 27, + }, + }, + Name: "bp", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "ClassDef", + '@token': "Module", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 468, + line: 23, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 474, + line: 23, + col: 13, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 475, + line: 23, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 484, + line: 23, + col: 23, + }, + }, + Name: "Blueprint", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 847, + line: 31, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 491, + line: 24, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 854, + line: 31, + col: 8, + }, + }, + Format: "", + Value: "Deprecated module support. Until Flask 0.6 modules were a different\n name of the concept now available as blueprints in Flask. They are\n essentially doing the same but have some bad semantics for templates and\n static files that were fixed with blueprints.\n\n .. versionchanged:: 0.7\n Modules were deprecated in favor for blueprints.\n ", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 864, + line: 33, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 872, + line: 33, + col: 17, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "__init__", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 980, + line: 35, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 982, + line: 35, + col: 11, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1009, + line: 36, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1015, + line: 36, + col: 19, + }, + }, + msg: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1036, + line: 36, + col: 40, + }, + }, + Format: "", + Value: "name required if package name does not point to a submodule", + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1016, + line: 36, + col: 20, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1023, + line: 36, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 1034, + line: 36, + col: 38, + }, + }, + Name: "import_name", + }, + ], + }, + left: { '@type': "uast:String", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1016, + line: 36, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 1019, + line: 36, + col: 23, + }, + }, + Format: "", + Value: ".", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "In", + '@token': "in", + '@role': [Contains, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1131, + line: 38, + col: 13, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1131, + line: 38, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1135, + line: 38, + col: 17, + }, + }, + Name: "name", + }, + ], + value: { '@type': "Subscript", + '@role': [Expression, Incomplete, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1138, + line: 38, + col: 20, + }, + }, + ctx: "Load", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "Num", + '@token': 1, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1165, + line: 38, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 1166, + line: 38, + col: 48, + }, + }, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1138, + line: 38, + col: 20, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1149, + line: 38, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 1150, + line: 38, + col: 32, + }, + }, + Format: "", + Value: ".", + }, + { '@type': "Num", + '@token': 1, + '@role': [Argument, Call, Expression, Function, Literal, Name, Number, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1162, + line: 38, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 1163, + line: 38, + col: 45, + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1139, + line: 38, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 1150, + line: 38, + col: 32, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1138, + line: 38, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 1149, + line: 38, + col: 31, + }, + }, + Name: "import_name", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1138, + line: 38, + col: 20, + }, + }, + Name: "rsplit", + }, + ], + }, + keywords: [], + }, + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 983, + line: 35, + col: 12, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 991, + line: 35, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 995, + line: 35, + col: 24, + }, + }, + LiteralValue: "None", + value: ~, + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 983, + line: 35, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 987, + line: 35, + col: 16, + }, + }, + Name: "name", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Is", + '@token': "is", + '@role': [Identical, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1176, + line: 39, + col: 9, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1176, + line: 39, + col: 9, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1195, + line: 39, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 1199, + line: 39, + col: 32, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1201, + line: 39, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 1205, + line: 39, + col: 38, + }, + }, + Name: "name", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1207, + line: 39, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 1218, + line: 39, + col: 51, + }, + }, + Name: "import_name", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1177, + line: 39, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 1186, + line: 39, + col: 19, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1176, + line: 39, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1185, + line: 39, + col: 18, + }, + }, + Name: "Blueprint", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1176, + line: 39, + col: 9, + }, + }, + Name: "__init__", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "url_prefix", + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1220, + line: 39, + col: 53, + }, + end: { '@type': "uast:Position", + offset: 1230, + line: 39, + col: 63, + }, + }, + Name: "url_prefix", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "subdomain", + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1270, + line: 40, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 1279, + line: 40, + col: 37, + }, + }, + Name: "subdomain", + }, + }, + ], + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1300, + line: 42, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1302, + line: 42, + col: 11, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1370, + line: 43, + col: 13, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1371, + line: 43, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 1375, + line: 43, + col: 18, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1370, + line: 43, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1374, + line: 43, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1370, + line: 43, + col: 13, + }, + }, + Name: "_static_folder", + }, + ], + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1392, + line: 43, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 1400, + line: 43, + col: 43, + }, + }, + Format: "", + Value: "static", + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Call", + '@role': [Call, Condition, Expression, Function, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1303, + line: 42, + col: 12, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1317, + line: 42, + col: 26, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1331, + line: 42, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 1335, + line: 42, + col: 44, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1330, + line: 42, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 1334, + line: 42, + col: 43, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1330, + line: 42, + col: 39, + }, + }, + Name: "root_path", + }, + ], + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1346, + line: 42, + col: 55, + }, + end: { '@type': "uast:Position", + offset: 1354, + line: 42, + col: 63, + }, + }, + Format: "", + Value: "static", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1318, + line: 42, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 1320, + line: 42, + col: 29, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1317, + line: 42, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 1319, + line: 42, + col: 28, + }, + }, + Name: "os", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1320, + line: 42, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 1324, + line: 42, + col: 33, + }, + }, + Name: "path", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1317, + line: 42, + col: 26, + }, + }, + Name: "join", + }, + ], + }, + keywords: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1304, + line: 42, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1306, + line: 42, + col: 15, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1303, + line: 42, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 1305, + line: 42, + col: 14, + }, + }, + Name: "os", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1306, + line: 42, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 1310, + line: 42, + col: 19, + }, + }, + Name: "path", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1303, + line: 42, + col: 12, + }, + }, + Name: "isdir", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 873, + line: 33, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 877, + line: 33, + col: 22, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 873, + line: 33, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 877, + line: 33, + col: 22, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 879, + line: 33, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 890, + line: 33, + col: 35, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 879, + line: 33, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 890, + line: 33, + col: 35, + }, + }, + Name: "import_name", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 892, + line: 33, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 896, + line: 33, + col: 41, + }, + }, + Init: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 897, + line: 33, + col: 42, + }, + end: { '@type': "uast:Position", + offset: 901, + line: 33, + col: 46, + }, + }, + LiteralValue: "None", + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 855, + line: 32, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 855, + line: 32, + col: 1, + }, + }, + lines: [], + }, + value: ~, + }, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 892, + line: 33, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 896, + line: 33, + col: 41, + }, + }, + Name: "name", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 903, + line: 33, + col: 48, + }, + end: { '@type': "uast:Position", + offset: 913, + line: 33, + col: 58, + }, + }, + Init: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 914, + line: 33, + col: 59, + }, + end: { '@type': "uast:Position", + offset: 918, + line: 33, + col: 63, + }, + }, + LiteralValue: "None", + value: ~, + }, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 903, + line: 33, + col: 48, + }, + end: { '@type': "uast:Position", + offset: 913, + line: 33, + col: 58, + }, + }, + Name: "url_prefix", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 937, + line: 34, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 948, + line: 34, + col: 29, + }, + }, + Init: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 949, + line: 34, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 953, + line: 34, + col: 34, + }, + }, + LiteralValue: "None", + value: ~, + }, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 937, + line: 34, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 948, + line: 34, + col: 29, + }, + }, + Name: "static_path", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 955, + line: 34, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 964, + line: 34, + col: 45, + }, + }, + Init: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 965, + line: 34, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 969, + line: 34, + col: 50, + }, + }, + LiteralValue: "None", + value: ~, + }, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 955, + line: 34, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 964, + line: 34, + col: 45, + }, + }, + Name: "subdomain", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_128_dst.uast b/uast/diff/testdata/testcase_128_dst.uast new file mode 100644 index 00000000..b09f4b31 --- /dev/null +++ b/uast/diff/testdata/testcase_128_dst.uast @@ -0,0 +1,1482 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 215, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 218, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n flask.module\n ~~~~~~~~~~~~\n\n Implements a class that represents module blueprints.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 220, + line: 12, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "os", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 219, + line: 11, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 219, + line: 11, + col: 1, + }, + }, + lines: [], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 231, + line: 14, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 247, + line: 14, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 290, + line: 17, + col: 24, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "blueprint_is_module", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 300, + line: 18, + col: 5, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 300, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 358, + line: 18, + col: 63, + }, + }, + Format: "", + Value: "Used to figure out if something is actually a module", + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 363, + line: 19, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 369, + line: 19, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 370, + line: 19, + col: 12, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 381, + line: 19, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 383, + line: 19, + col: 25, + }, + }, + Name: "bp", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 385, + line: 19, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 391, + line: 19, + col: 33, + }, + }, + Name: "Module", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 370, + line: 19, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 380, + line: 19, + col: 22, + }, + }, + Name: "isinstance", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 291, + line: 17, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 293, + line: 17, + col: 27, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 291, + line: 17, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 293, + line: 17, + col: 27, + }, + }, + Name: "bp", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "ClassDef", + '@token': "Module", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 401, + line: 22, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 407, + line: 22, + col: 13, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 408, + line: 22, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 417, + line: 22, + col: 23, + }, + }, + Name: "Blueprint", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 780, + line: 30, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 424, + line: 23, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 787, + line: 30, + col: 8, + }, + }, + Format: "", + Value: "Deprecated module support. Until Flask 0.6 modules were a different\n name of the concept now available as blueprints in Flask. They are\n essentially doing the same but have some bad semantics for templates and\n static files that were fixed with blueprints.\n\n .. versionchanged:: 0.7\n Modules were deprecated in favor for blueprints.\n ", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 797, + line: 32, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 805, + line: 32, + col: 17, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "__init__", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 913, + line: 34, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 915, + line: 34, + col: 11, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 942, + line: 35, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 948, + line: 35, + col: 19, + }, + }, + msg: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 969, + line: 35, + col: 40, + }, + }, + Format: "", + Value: "name required if package name does not point to a submodule", + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 949, + line: 35, + col: 20, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 956, + line: 35, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 967, + line: 35, + col: 38, + }, + }, + Name: "import_name", + }, + ], + }, + left: { '@type': "uast:String", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 949, + line: 35, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 952, + line: 35, + col: 23, + }, + }, + Format: "", + Value: ".", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "In", + '@token': "in", + '@role': [Contains, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1064, + line: 37, + col: 13, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1064, + line: 37, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1068, + line: 37, + col: 17, + }, + }, + Name: "name", + }, + ], + value: { '@type': "Subscript", + '@role': [Expression, Incomplete, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1071, + line: 37, + col: 20, + }, + }, + ctx: "Load", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "Num", + '@token': 1, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1098, + line: 37, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 1099, + line: 37, + col: 48, + }, + }, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1071, + line: 37, + col: 20, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1082, + line: 37, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 1083, + line: 37, + col: 32, + }, + }, + Format: "", + Value: ".", + }, + { '@type': "Num", + '@token': 1, + '@role': [Argument, Call, Expression, Function, Literal, Name, Number, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1095, + line: 37, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 1096, + line: 37, + col: 45, + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1072, + line: 37, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 1083, + line: 37, + col: 32, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1071, + line: 37, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 1082, + line: 37, + col: 31, + }, + }, + Name: "import_name", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1071, + line: 37, + col: 20, + }, + }, + Name: "rsplit", + }, + ], + }, + keywords: [], + }, + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 916, + line: 34, + col: 12, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 924, + line: 34, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 928, + line: 34, + col: 24, + }, + }, + LiteralValue: "None", + value: ~, + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 916, + line: 34, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 920, + line: 34, + col: 16, + }, + }, + Name: "name", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Is", + '@token': "is", + '@role': [Identical, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1109, + line: 38, + col: 9, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1109, + line: 38, + col: 9, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1128, + line: 38, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 1132, + line: 38, + col: 32, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1134, + line: 38, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 1138, + line: 38, + col: 38, + }, + }, + Name: "name", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1140, + line: 38, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 1151, + line: 38, + col: 51, + }, + }, + Name: "import_name", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1110, + line: 38, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 1119, + line: 38, + col: 19, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1109, + line: 38, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1118, + line: 38, + col: 18, + }, + }, + Name: "Blueprint", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1109, + line: 38, + col: 9, + }, + }, + Name: "__init__", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "url_prefix", + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1153, + line: 38, + col: 53, + }, + end: { '@type': "uast:Position", + offset: 1163, + line: 38, + col: 63, + }, + }, + Name: "url_prefix", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "subdomain", + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1203, + line: 39, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 1212, + line: 39, + col: 37, + }, + }, + Name: "subdomain", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "template_folder", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1240, + line: 39, + col: 65, + }, + end: { '@type': "uast:Position", + offset: 1251, + line: 39, + col: 76, + }, + }, + Format: "", + Value: "templates", + }, + }, + ], + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1262, + line: 41, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1264, + line: 41, + col: 11, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1332, + line: 42, + col: 13, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1333, + line: 42, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 1337, + line: 42, + col: 18, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1332, + line: 42, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1336, + line: 42, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1332, + line: 42, + col: 13, + }, + }, + Name: "_static_folder", + }, + ], + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1354, + line: 42, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 1362, + line: 42, + col: 43, + }, + }, + Format: "", + Value: "static", + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Call", + '@role': [Call, Condition, Expression, Function, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1265, + line: 41, + col: 12, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1279, + line: 41, + col: 26, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1293, + line: 41, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 1297, + line: 41, + col: 44, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1292, + line: 41, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 1296, + line: 41, + col: 43, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1292, + line: 41, + col: 39, + }, + }, + Name: "root_path", + }, + ], + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1308, + line: 41, + col: 55, + }, + end: { '@type': "uast:Position", + offset: 1316, + line: 41, + col: 63, + }, + }, + Format: "", + Value: "static", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1280, + line: 41, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 1282, + line: 41, + col: 29, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1279, + line: 41, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 1281, + line: 41, + col: 28, + }, + }, + Name: "os", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1282, + line: 41, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 1286, + line: 41, + col: 33, + }, + }, + Name: "path", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1279, + line: 41, + col: 26, + }, + }, + Name: "join", + }, + ], + }, + keywords: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1266, + line: 41, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1268, + line: 41, + col: 15, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1265, + line: 41, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 1267, + line: 41, + col: 14, + }, + }, + Name: "os", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1268, + line: 41, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 1272, + line: 41, + col: 19, + }, + }, + Name: "path", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1265, + line: 41, + col: 12, + }, + }, + Name: "isdir", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 806, + line: 32, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 810, + line: 32, + col: 22, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 806, + line: 32, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 810, + line: 32, + col: 22, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 812, + line: 32, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 823, + line: 32, + col: 35, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 812, + line: 32, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 823, + line: 32, + col: 35, + }, + }, + Name: "import_name", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 825, + line: 32, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 829, + line: 32, + col: 41, + }, + }, + Init: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 830, + line: 32, + col: 42, + }, + end: { '@type': "uast:Position", + offset: 834, + line: 32, + col: 46, + }, + }, + LiteralValue: "None", + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 788, + line: 31, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 788, + line: 31, + col: 1, + }, + }, + lines: [], + }, + value: ~, + }, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 825, + line: 32, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 829, + line: 32, + col: 41, + }, + }, + Name: "name", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 836, + line: 32, + col: 48, + }, + end: { '@type': "uast:Position", + offset: 846, + line: 32, + col: 58, + }, + }, + Init: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 847, + line: 32, + col: 59, + }, + end: { '@type': "uast:Position", + offset: 851, + line: 32, + col: 63, + }, + }, + LiteralValue: "None", + value: ~, + }, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 836, + line: 32, + col: 48, + }, + end: { '@type': "uast:Position", + offset: 846, + line: 32, + col: 58, + }, + }, + Name: "url_prefix", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 870, + line: 33, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 881, + line: 33, + col: 29, + }, + }, + Init: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 882, + line: 33, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 886, + line: 33, + col: 34, + }, + }, + LiteralValue: "None", + value: ~, + }, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 870, + line: 33, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 881, + line: 33, + col: 29, + }, + }, + Name: "static_path", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 33, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 897, + line: 33, + col: 45, + }, + }, + Init: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 898, + line: 33, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 902, + line: 33, + col: 50, + }, + }, + LiteralValue: "None", + value: ~, + }, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 33, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 897, + line: 33, + col: 45, + }, + }, + Name: "subdomain", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_128_src.uast b/uast/diff/testdata/testcase_128_src.uast new file mode 100644 index 00000000..426aa4b3 --- /dev/null +++ b/uast/diff/testdata/testcase_128_src.uast @@ -0,0 +1,1482 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 215, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 218, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n flask.module\n ~~~~~~~~~~~~\n\n Implements a class that represents module blueprints.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 220, + line: 12, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "os", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 219, + line: 11, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 219, + line: 11, + col: 1, + }, + }, + lines: [], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 231, + line: 14, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 247, + line: 14, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 290, + line: 17, + col: 24, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "blueprint_is_module", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 300, + line: 18, + col: 5, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 300, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 358, + line: 18, + col: 63, + }, + }, + Format: "", + Value: "Used to figure out if something is actually a module", + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 363, + line: 19, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 369, + line: 19, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 370, + line: 19, + col: 12, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 381, + line: 19, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 383, + line: 19, + col: 25, + }, + }, + Name: "bp", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 385, + line: 19, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 391, + line: 19, + col: 33, + }, + }, + Name: "Module", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 370, + line: 19, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 380, + line: 19, + col: 22, + }, + }, + Name: "isinstance", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 291, + line: 17, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 293, + line: 17, + col: 27, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 291, + line: 17, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 293, + line: 17, + col: 27, + }, + }, + Name: "bp", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "ClassDef", + '@token': "Module", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 401, + line: 22, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 407, + line: 22, + col: 13, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 408, + line: 22, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 417, + line: 22, + col: 23, + }, + }, + Name: "Blueprint", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 780, + line: 30, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 424, + line: 23, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 787, + line: 30, + col: 8, + }, + }, + Format: "", + Value: "Deprecated module support. Until Flask 0.6 modules were a different\n name of the concept now available as blueprints in Flask. They are\n essentially doing the same but have some bad semantics for templates and\n static files that were fixed with blueprints.\n\n .. versionchanged:: 0.7\n Modules were deprecated in favor for blueprints.\n ", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 797, + line: 32, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 805, + line: 32, + col: 17, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "__init__", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 913, + line: 34, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 915, + line: 34, + col: 11, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 942, + line: 35, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 948, + line: 35, + col: 19, + }, + }, + msg: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 969, + line: 35, + col: 40, + }, + }, + Format: "", + Value: "name required if package name does not point to a submodule", + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 949, + line: 35, + col: 20, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 956, + line: 35, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 967, + line: 35, + col: 38, + }, + }, + Name: "import_name", + }, + ], + }, + left: { '@type': "uast:String", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 949, + line: 35, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 952, + line: 35, + col: 23, + }, + }, + Format: "", + Value: ".", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "In", + '@token': "in", + '@role': [Contains, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1064, + line: 37, + col: 13, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1064, + line: 37, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1068, + line: 37, + col: 17, + }, + }, + Name: "name", + }, + ], + value: { '@type': "Subscript", + '@role': [Expression, Incomplete, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1071, + line: 37, + col: 20, + }, + }, + ctx: "Load", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "Num", + '@token': 1, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1098, + line: 37, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 1099, + line: 37, + col: 48, + }, + }, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1071, + line: 37, + col: 20, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1082, + line: 37, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 1083, + line: 37, + col: 32, + }, + }, + Format: "", + Value: ".", + }, + { '@type': "Num", + '@token': 1, + '@role': [Argument, Call, Expression, Function, Literal, Name, Number, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1095, + line: 37, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 1096, + line: 37, + col: 45, + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1072, + line: 37, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 1083, + line: 37, + col: 32, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1071, + line: 37, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 1082, + line: 37, + col: 31, + }, + }, + Name: "import_name", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1071, + line: 37, + col: 20, + }, + }, + Name: "rsplit", + }, + ], + }, + keywords: [], + }, + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 916, + line: 34, + col: 12, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 924, + line: 34, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 928, + line: 34, + col: 24, + }, + }, + LiteralValue: "None", + value: ~, + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 916, + line: 34, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 920, + line: 34, + col: 16, + }, + }, + Name: "name", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Is", + '@token': "is", + '@role': [Identical, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1109, + line: 38, + col: 9, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1109, + line: 38, + col: 9, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1128, + line: 38, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 1132, + line: 38, + col: 32, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1134, + line: 38, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 1138, + line: 38, + col: 38, + }, + }, + Name: "name", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1140, + line: 38, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 1151, + line: 38, + col: 51, + }, + }, + Name: "import_name", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1110, + line: 38, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 1119, + line: 38, + col: 19, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1109, + line: 38, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1118, + line: 38, + col: 18, + }, + }, + Name: "Blueprint", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1109, + line: 38, + col: 9, + }, + }, + Name: "__init__", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "url_prefix", + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1153, + line: 38, + col: 53, + }, + end: { '@type': "uast:Position", + offset: 1163, + line: 38, + col: 63, + }, + }, + Name: "url_prefix", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "subdomain", + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1203, + line: 39, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 1212, + line: 39, + col: 37, + }, + }, + Name: "subdomain", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "template_folder", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1240, + line: 39, + col: 65, + }, + end: { '@type': "uast:Position", + offset: 1251, + line: 39, + col: 76, + }, + }, + Format: "", + Value: "templates", + }, + }, + ], + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1262, + line: 41, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1264, + line: 41, + col: 11, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1332, + line: 42, + col: 13, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1333, + line: 42, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 1337, + line: 42, + col: 18, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1332, + line: 42, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1336, + line: 42, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1332, + line: 42, + col: 13, + }, + }, + Name: "_static_folder", + }, + ], + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1354, + line: 42, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 1362, + line: 42, + col: 43, + }, + }, + Format: "", + Value: "static", + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Call", + '@role': [Call, Condition, Expression, Function, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1265, + line: 41, + col: 12, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1279, + line: 41, + col: 26, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1293, + line: 41, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 1297, + line: 41, + col: 44, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1292, + line: 41, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 1296, + line: 41, + col: 43, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1292, + line: 41, + col: 39, + }, + }, + Name: "root_path", + }, + ], + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1308, + line: 41, + col: 55, + }, + end: { '@type': "uast:Position", + offset: 1316, + line: 41, + col: 63, + }, + }, + Format: "", + Value: "static", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1280, + line: 41, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 1282, + line: 41, + col: 29, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1279, + line: 41, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 1281, + line: 41, + col: 28, + }, + }, + Name: "os", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1282, + line: 41, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 1286, + line: 41, + col: 33, + }, + }, + Name: "path", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1279, + line: 41, + col: 26, + }, + }, + Name: "join", + }, + ], + }, + keywords: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1266, + line: 41, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1268, + line: 41, + col: 15, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1265, + line: 41, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 1267, + line: 41, + col: 14, + }, + }, + Name: "os", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1268, + line: 41, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 1272, + line: 41, + col: 19, + }, + }, + Name: "path", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1265, + line: 41, + col: 12, + }, + }, + Name: "isdir", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 806, + line: 32, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 810, + line: 32, + col: 22, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 806, + line: 32, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 810, + line: 32, + col: 22, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 812, + line: 32, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 823, + line: 32, + col: 35, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 812, + line: 32, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 823, + line: 32, + col: 35, + }, + }, + Name: "import_name", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 825, + line: 32, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 829, + line: 32, + col: 41, + }, + }, + Init: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 830, + line: 32, + col: 42, + }, + end: { '@type': "uast:Position", + offset: 834, + line: 32, + col: 46, + }, + }, + LiteralValue: "None", + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 788, + line: 31, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 788, + line: 31, + col: 1, + }, + }, + lines: [], + }, + value: ~, + }, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 825, + line: 32, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 829, + line: 32, + col: 41, + }, + }, + Name: "name", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 836, + line: 32, + col: 48, + }, + end: { '@type': "uast:Position", + offset: 846, + line: 32, + col: 58, + }, + }, + Init: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 847, + line: 32, + col: 59, + }, + end: { '@type': "uast:Position", + offset: 851, + line: 32, + col: 63, + }, + }, + LiteralValue: "None", + value: ~, + }, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 836, + line: 32, + col: 48, + }, + end: { '@type': "uast:Position", + offset: 846, + line: 32, + col: 58, + }, + }, + Name: "url_prefix", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 870, + line: 33, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 881, + line: 33, + col: 29, + }, + }, + Init: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 882, + line: 33, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 886, + line: 33, + col: 34, + }, + }, + LiteralValue: "None", + value: ~, + }, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 870, + line: 33, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 881, + line: 33, + col: 29, + }, + }, + Name: "static_path", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 33, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 897, + line: 33, + col: 45, + }, + }, + Init: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 898, + line: 33, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 902, + line: 33, + col: 50, + }, + }, + LiteralValue: "None", + value: ~, + }, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 33, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 897, + line: 33, + col: 45, + }, + }, + Name: "subdomain", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_129_dst.uast b/uast/diff/testdata/testcase_129_dst.uast new file mode 100644 index 00000000..58257bff --- /dev/null +++ b/uast/diff/testdata/testcase_129_dst.uast @@ -0,0 +1,702 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 13, + col: 12, + }, + }, + Name: "__version__", + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 13, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 280, + line: 13, + col: 24, + }, + }, + Format: "", + Value: "0.9-dev", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 399, + line: 17, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.exceptions", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 437, + line: 18, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.utils", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 473, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 484, + line: 19, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 508, + line: 21, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 517, + line: 21, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 550, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 562, + line: 22, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 577, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 590, + line: 23, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 754, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 767, + line: 26, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_app_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 851, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 860, + line: 28, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 900, + line: 29, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 915, + line: 30, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 931, + line: 30, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 949, + line: 31, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 965, + line: 31, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1028, + line: 34, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1041, + line: 34, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1211, + line: 38, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1213, + line: 38, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1234, + line: 39, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1247, + line: 39, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1214, + line: 38, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1228, + line: 38, + col: 18, + }, + }, + Name: "json_available", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1298, + line: 42, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1312, + line: 42, + col: 15, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "SecureCookieSession", + }, + Node: { '@type': "uast:Identifier", + Name: "Session", + }, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../sessions", + }, + Target: ~, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_129_src.uast b/uast/diff/testdata/testcase_129_src.uast new file mode 100644 index 00000000..2eeac0e7 --- /dev/null +++ b/uast/diff/testdata/testcase_129_src.uast @@ -0,0 +1,694 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 13, + col: 12, + }, + }, + Name: "__version__", + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 13, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 280, + line: 13, + col: 24, + }, + }, + Format: "", + Value: "0.9-dev", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 399, + line: 17, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.exceptions", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 437, + line: 18, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.utils", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 473, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 484, + line: 19, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 508, + line: 21, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 517, + line: 21, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 550, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 562, + line: 22, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 577, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 590, + line: 23, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 754, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 767, + line: 26, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 828, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 837, + line: 27, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 865, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 877, + line: 28, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 892, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 908, + line: 29, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 926, + line: 30, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 942, + line: 30, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1005, + line: 33, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1018, + line: 33, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1188, + line: 37, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1190, + line: 37, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1211, + line: 38, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1224, + line: 38, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1191, + line: 37, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1205, + line: 37, + col: 18, + }, + }, + Name: "json_available", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1275, + line: 41, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1289, + line: 41, + col: 15, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "SecureCookieSession", + }, + Node: { '@type': "uast:Identifier", + Name: "Session", + }, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../sessions", + }, + Target: ~, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_12_dst.uast b/uast/diff/testdata/testcase_12_dst.uast new file mode 100644 index 00000000..ba157e75 --- /dev/null +++ b/uast/diff/testdata/testcase_12_dst.uast @@ -0,0 +1,69 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "main", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.testsuite", + }, + Target: ~, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 33, + line: 2, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 33, + line: 2, + col: 1, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 33, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 37, + line: 2, + col: 5, + }, + }, + Name: "main", + }, + keywords: [], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_12_src.uast b/uast/diff/testdata/testcase_12_src.uast new file mode 100644 index 00000000..99e9c673 --- /dev/null +++ b/uast/diff/testdata/testcase_12_src.uast @@ -0,0 +1,317 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "unittest", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 16, + line: 2, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "BetterLoader", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.testsuite", + }, + Target: ~, + }, + { '@type': "TryExcept", + '@role': [Catch, Statement, Try], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 3, + col: 1, + }, + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 66, + line: 4, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 66, + line: 4, + col: 5, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 67, + line: 4, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 75, + line: 4, + col: 14, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 66, + line: 4, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 74, + line: 4, + col: 13, + }, + }, + Name: "unittest", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 66, + line: 4, + col: 5, + }, + }, + Name: "main", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "testLoader", + }, + value: { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 91, + line: 4, + col: 30, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 91, + line: 4, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 103, + line: 4, + col: 42, + }, + }, + Name: "BetterLoader", + }, + keywords: [], + kwargs: ~, + starargs: ~, + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "defaultTest", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 119, + line: 4, + col: 58, + }, + end: { '@type': "uast:Position", + offset: 126, + line: 4, + col: 65, + }, + }, + Format: "", + Value: "suite", + }, + }, + ], + kwargs: ~, + starargs: ~, + }, + }, + ], + handlers: [ + { '@type': "ExceptHandler", + '@role': [Catch, Identifier, Try], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 128, + line: 5, + col: 1, + }, + }, + '@token': { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 146, + line: 5, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 147, + line: 5, + col: 20, + }, + }, + Name: "e", + }, + body: [ + { '@type': "Print", + '@token': "print", + '@role': [Call, Callee, Expression, Function, Identifier], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 153, + line: 6, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 158, + line: 6, + col: 10, + }, + }, + dest: ~, + nl: true, + values: [ + { '@type': "BinOp", + '@role': [Argument, Binary, Call, Expression, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 159, + line: 6, + col: 11, + }, + }, + left: { '@type': "uast:String", + '@role': [Binary, Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 159, + line: 6, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 170, + line: 6, + col: 22, + }, + }, + Format: "", + Value: "Error: %s", + }, + op: { '@type': "Mod", + '@token': "%", + '@role': [Arithmetic, Binary, Module, Operator], + '@pos': { '@type': "uast:Positions", + }, + }, + right: { '@type': "uast:Identifier", + '@role': [Binary, Expression, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 173, + line: 6, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 174, + line: 6, + col: 26, + }, + }, + Name: "e", + }, + }, + ], + }, + ], + type: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 135, + line: 5, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 144, + line: 5, + col: 17, + }, + }, + Name: "Exception", + }, + }, + ], + orelse: [], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_130_dst.uast b/uast/diff/testdata/testcase_130_dst.uast new file mode 100644 index 00000000..6df82b85 --- /dev/null +++ b/uast/diff/testdata/testcase_130_dst.uast @@ -0,0 +1,710 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 13, + col: 12, + }, + }, + Name: "__version__", + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 13, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 280, + line: 13, + col: 24, + }, + }, + Format: "", + Value: "0.9-dev", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 399, + line: 17, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.exceptions", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 437, + line: 18, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.utils", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 473, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 484, + line: 19, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 508, + line: 21, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 517, + line: 21, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 550, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 562, + line: 22, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 577, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 590, + line: 23, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 754, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 767, + line: 26, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_app_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 851, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 860, + line: 28, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_app_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 905, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 917, + line: 29, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 932, + line: 30, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 948, + line: 30, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 966, + line: 31, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 982, + line: 31, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1045, + line: 34, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1058, + line: 34, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1228, + line: 38, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1230, + line: 38, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1251, + line: 39, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1264, + line: 39, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1231, + line: 38, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1245, + line: 38, + col: 18, + }, + }, + Name: "json_available", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1315, + line: 42, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1329, + line: 42, + col: 15, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "SecureCookieSession", + }, + Node: { '@type': "uast:Identifier", + Name: "Session", + }, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../sessions", + }, + Target: ~, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_130_src.uast b/uast/diff/testdata/testcase_130_src.uast new file mode 100644 index 00000000..58257bff --- /dev/null +++ b/uast/diff/testdata/testcase_130_src.uast @@ -0,0 +1,702 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 13, + col: 12, + }, + }, + Name: "__version__", + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 13, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 280, + line: 13, + col: 24, + }, + }, + Format: "", + Value: "0.9-dev", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 399, + line: 17, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.exceptions", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 437, + line: 18, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.utils", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 473, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 484, + line: 19, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 508, + line: 21, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 517, + line: 21, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 550, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 562, + line: 22, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 577, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 590, + line: 23, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 754, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 767, + line: 26, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_app_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 851, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 860, + line: 28, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 900, + line: 29, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 915, + line: 30, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 931, + line: 30, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 949, + line: 31, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 965, + line: 31, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1028, + line: 34, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1041, + line: 34, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1211, + line: 38, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1213, + line: 38, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1234, + line: 39, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1247, + line: 39, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1214, + line: 38, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1228, + line: 38, + col: 18, + }, + }, + Name: "json_available", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1298, + line: 42, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1312, + line: 42, + col: 15, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "SecureCookieSession", + }, + Node: { '@type': "uast:Identifier", + Name: "Session", + }, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../sessions", + }, + Target: ~, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_131_dst.uast b/uast/diff/testdata/testcase_131_dst.uast new file mode 100644 index 00000000..645ba4aa --- /dev/null +++ b/uast/diff/testdata/testcase_131_dst.uast @@ -0,0 +1,718 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 13, + col: 12, + }, + }, + Name: "__version__", + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 13, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 280, + line: 13, + col: 24, + }, + }, + Format: "", + Value: "0.9-dev", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 399, + line: 17, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.exceptions", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 437, + line: 18, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.utils", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 473, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 484, + line: 19, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 508, + line: 21, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 517, + line: 21, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 550, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 562, + line: 22, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 577, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 590, + line: 23, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 754, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 767, + line: 26, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_app_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 851, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 860, + line: 28, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_app_context", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "after_this_request", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 932, + line: 30, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 944, + line: 30, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 959, + line: 31, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 975, + line: 31, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 993, + line: 32, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1009, + line: 32, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1072, + line: 35, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1085, + line: 35, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1255, + line: 39, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1257, + line: 39, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1278, + line: 40, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1291, + line: 40, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1258, + line: 39, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1272, + line: 39, + col: 18, + }, + }, + Name: "json_available", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1342, + line: 43, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1356, + line: 43, + col: 15, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "SecureCookieSession", + }, + Node: { '@type': "uast:Identifier", + Name: "Session", + }, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../sessions", + }, + Target: ~, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_131_src.uast b/uast/diff/testdata/testcase_131_src.uast new file mode 100644 index 00000000..6df82b85 --- /dev/null +++ b/uast/diff/testdata/testcase_131_src.uast @@ -0,0 +1,710 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 13, + col: 12, + }, + }, + Name: "__version__", + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 13, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 280, + line: 13, + col: 24, + }, + }, + Format: "", + Value: "0.9-dev", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 399, + line: 17, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.exceptions", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 437, + line: 18, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.utils", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 473, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 484, + line: 19, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 508, + line: 21, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 517, + line: 21, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 550, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 562, + line: 22, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 577, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 590, + line: 23, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 754, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 767, + line: 26, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_app_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 851, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 860, + line: 28, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_app_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 905, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 917, + line: 29, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 932, + line: 30, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 948, + line: 30, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 966, + line: 31, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 982, + line: 31, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1045, + line: 34, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1058, + line: 34, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1228, + line: 38, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1230, + line: 38, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1251, + line: 39, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1264, + line: 39, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1231, + line: 38, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1245, + line: 38, + col: 18, + }, + }, + Name: "json_available", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1315, + line: 42, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1329, + line: 42, + col: 15, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "SecureCookieSession", + }, + Node: { '@type': "uast:Identifier", + Name: "Session", + }, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../sessions", + }, + Target: ~, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_132_dst.uast b/uast/diff/testdata/testcase_132_dst.uast new file mode 100644 index 00000000..a95fa1cf --- /dev/null +++ b/uast/diff/testdata/testcase_132_dst.uast @@ -0,0 +1,1088 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 242, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 245, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask.session\n ~~~~~~~~~~~~~\n\n Implements cookie based sessions based on Werkzeug's secure cookie\n system.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 247, + line: 13, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "SecureCookie", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.contrib.securecookie", + }, + Target: ~, + }, + { '@type': "ClassDef", + '@token': "Session", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 310, + line: 16, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 317, + line: 16, + col: 14, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 318, + line: 16, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 330, + line: 16, + col: 27, + }, + }, + Name: "SecureCookie", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 437, + line: 19, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 337, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 444, + line: 19, + col: 8, + }, + }, + Format: "", + Value: "Expands the session with support for switching between permanent\n and non-permanent sessions.\n ", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 454, + line: 21, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 468, + line: 21, + col: 23, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_get_permanent", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 484, + line: 22, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 490, + line: 22, + col: 15, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 491, + line: 22, + col: 16, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 500, + line: 22, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 512, + line: 22, + col: 37, + }, + }, + Format: "", + Value: "_permanent", + }, + { '@type': "BoolLiteral", + '@token': "False", + '@role': [Argument, Boolean, Call, Expression, Function, Literal, Name, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 514, + line: 22, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 519, + line: 22, + col: 44, + }, + }, + value: false, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 492, + line: 22, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 496, + line: 22, + col: 21, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 491, + line: 22, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 495, + line: 22, + col: 20, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 491, + line: 22, + col: 16, + }, + }, + Name: "get", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 469, + line: 21, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 473, + line: 21, + col: 28, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 469, + line: 21, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 473, + line: 21, + col: 28, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 530, + line: 24, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 544, + line: 24, + col: 23, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_set_permanent", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 567, + line: 25, + col: 9, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 567, + line: 25, + col: 9, + }, + }, + ctx: "Store", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 572, + line: 25, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 584, + line: 25, + col: 26, + }, + }, + Format: "", + Value: "_permanent", + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 567, + line: 25, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 571, + line: 25, + col: 13, + }, + }, + Name: "self", + }, + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 588, + line: 25, + col: 30, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 593, + line: 25, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 598, + line: 25, + col: 40, + }, + }, + Name: "value", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 588, + line: 25, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 592, + line: 25, + col: 34, + }, + }, + Name: "bool", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 545, + line: 24, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 549, + line: 24, + col: 28, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 545, + line: 24, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 549, + line: 24, + col: 28, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 551, + line: 24, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 556, + line: 24, + col: 35, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 551, + line: 24, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 556, + line: 24, + col: 35, + }, + }, + Name: "value", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 605, + line: 27, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 605, + line: 27, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 614, + line: 27, + col: 14, + }, + }, + Name: "permanent", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 617, + line: 27, + col: 17, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 626, + line: 27, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 640, + line: 27, + col: 40, + }, + }, + Name: "_get_permanent", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 642, + line: 27, + col: 42, + }, + end: { '@type': "uast:Position", + offset: 656, + line: 27, + col: 56, + }, + }, + Name: "_set_permanent", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 617, + line: 27, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 625, + line: 27, + col: 25, + }, + }, + Name: "property", + }, + keywords: [], + }, + }, + { '@type': "Delete", + '@token': "del", + '@role': [Incomplete, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 662, + line: 28, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 665, + line: 28, + col: 8, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 666, + line: 28, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 680, + line: 28, + col: 23, + }, + }, + Name: "_get_permanent", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 682, + line: 28, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 696, + line: 28, + col: 39, + }, + }, + Name: "_set_permanent", + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "ClassDef", + '@token': "_NullSession", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 705, + line: 31, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 717, + line: 31, + col: 19, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 718, + line: 31, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 725, + line: 31, + col: 27, + }, + }, + Name: "Session", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 895, + line: 35, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 732, + line: 32, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 902, + line: 35, + col: 8, + }, + }, + Format: "", + Value: "Class used to generate nicer error messages if sessions are not\n available. Will still allow read-only access to the empty session\n but fail on setting.\n ", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 912, + line: 37, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 917, + line: 37, + col: 14, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_fail", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Raise", + '@token': "raise", + '@role': [Statement, Throw], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 950, + line: 38, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 955, + line: 38, + col: 14, + }, + }, + cause: ~, + exc: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 956, + line: 38, + col: 15, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 969, + line: 38, + col: 28, + }, + }, + Format: "", + Value: "the session is unavailable because no secret key was set. Set the secret_key on the application to something unique and secret", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 956, + line: 38, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 968, + line: 38, + col: 27, + }, + }, + Name: "RuntimeError", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 918, + line: 37, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 922, + line: 37, + col: 19, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 918, + line: 37, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 922, + line: 37, + col: 19, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 933, + line: 37, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 939, + line: 37, + col: 36, + }, + }, + Init: ~, + MapVariadic: true, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 933, + line: 37, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 939, + line: 37, + col: 36, + }, + }, + Name: "kwargs", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 925, + line: 37, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 929, + line: 37, + col: 26, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 925, + line: 37, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 929, + line: 37, + col: 26, + }, + }, + Name: "args", + }, + Receiver: false, + Type: ~, + Variadic: true, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1164, + line: 41, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1164, + line: 41, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1175, + line: 41, + col: 16, + }, + }, + Name: "__setitem__", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1178, + line: 41, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 1189, + line: 41, + col: 30, + }, + }, + Name: "__delitem__", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1192, + line: 41, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 1197, + line: 41, + col: 38, + }, + }, + Name: "clear", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1200, + line: 41, + col: 41, + }, + end: { '@type': "uast:Position", + offset: 1203, + line: 41, + col: 44, + }, + }, + Name: "pop", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1206, + line: 41, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 1213, + line: 41, + col: 54, + }, + }, + Name: "popitem", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1226, + line: 42, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1232, + line: 42, + col: 15, + }, + }, + Name: "update", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1235, + line: 42, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 1245, + line: 42, + col: 28, + }, + }, + Name: "setdefault", + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1248, + line: 42, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 1253, + line: 42, + col: 36, + }, + }, + Name: "_fail", + }, + }, + { '@type': "Delete", + '@token': "del", + '@role': [Incomplete, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1258, + line: 43, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1261, + line: 43, + col: 8, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1262, + line: 43, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1267, + line: 43, + col: 14, + }, + }, + Name: "_fail", + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_132_src.uast b/uast/diff/testdata/testcase_132_src.uast new file mode 100644 index 00000000..3117b6d5 --- /dev/null +++ b/uast/diff/testdata/testcase_132_src.uast @@ -0,0 +1,1062 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "SecureCookie", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.contrib.securecookie", + }, + Target: ~, + }, + { '@type': "ClassDef", + '@token': "Session", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 63, + line: 4, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 70, + line: 4, + col: 14, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 71, + line: 4, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 83, + line: 4, + col: 27, + }, + }, + Name: "SecureCookie", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 190, + line: 7, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 90, + line: 5, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 197, + line: 7, + col: 8, + }, + }, + Format: "", + Value: "Expands the session with support for switching between permanent\n and non-permanent sessions.\n ", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 207, + line: 9, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 221, + line: 9, + col: 23, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_get_permanent", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 237, + line: 10, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 243, + line: 10, + col: 15, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 244, + line: 10, + col: 16, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 253, + line: 10, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 265, + line: 10, + col: 37, + }, + }, + Format: "", + Value: "_permanent", + }, + { '@type': "BoolLiteral", + '@token': "False", + '@role': [Argument, Boolean, Call, Expression, Function, Literal, Name, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 267, + line: 10, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 272, + line: 10, + col: 44, + }, + }, + value: false, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 245, + line: 10, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 249, + line: 10, + col: 21, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 244, + line: 10, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 248, + line: 10, + col: 20, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 244, + line: 10, + col: 16, + }, + }, + Name: "get", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 222, + line: 9, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 226, + line: 9, + col: 28, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 222, + line: 9, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 226, + line: 9, + col: 28, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 283, + line: 12, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 297, + line: 12, + col: 23, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_set_permanent", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 320, + line: 13, + col: 9, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 320, + line: 13, + col: 9, + }, + }, + ctx: "Store", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 325, + line: 13, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 337, + line: 13, + col: 26, + }, + }, + Format: "", + Value: "_permanent", + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 320, + line: 13, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 324, + line: 13, + col: 13, + }, + }, + Name: "self", + }, + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 341, + line: 13, + col: 30, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 346, + line: 13, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 351, + line: 13, + col: 40, + }, + }, + Name: "value", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 341, + line: 13, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 345, + line: 13, + col: 34, + }, + }, + Name: "bool", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 298, + line: 12, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 302, + line: 12, + col: 28, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 298, + line: 12, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 302, + line: 12, + col: 28, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 304, + line: 12, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 309, + line: 12, + col: 35, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 304, + line: 12, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 309, + line: 12, + col: 35, + }, + }, + Name: "value", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 358, + line: 15, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 358, + line: 15, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 367, + line: 15, + col: 14, + }, + }, + Name: "permanent", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 370, + line: 15, + col: 17, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 379, + line: 15, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 393, + line: 15, + col: 40, + }, + }, + Name: "_get_permanent", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 395, + line: 15, + col: 42, + }, + end: { '@type': "uast:Position", + offset: 409, + line: 15, + col: 56, + }, + }, + Name: "_set_permanent", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 370, + line: 15, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 378, + line: 15, + col: 25, + }, + }, + Name: "property", + }, + keywords: [], + }, + }, + { '@type': "Delete", + '@token': "del", + '@role': [Incomplete, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 415, + line: 16, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 418, + line: 16, + col: 8, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 419, + line: 16, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 433, + line: 16, + col: 23, + }, + }, + Name: "_get_permanent", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 435, + line: 16, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 449, + line: 16, + col: 39, + }, + }, + Name: "_set_permanent", + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "ClassDef", + '@token': "_NullSession", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 458, + line: 19, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 470, + line: 19, + col: 19, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 471, + line: 19, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 478, + line: 19, + col: 27, + }, + }, + Name: "Session", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 648, + line: 23, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 485, + line: 20, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 655, + line: 23, + col: 8, + }, + }, + Format: "", + Value: "Class used to generate nicer error messages if sessions are not\n available. Will still allow read-only access to the empty session\n but fail on setting.\n ", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 665, + line: 25, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 670, + line: 25, + col: 14, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_fail", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Raise", + '@token': "raise", + '@role': [Statement, Throw], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 703, + line: 26, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 708, + line: 26, + col: 14, + }, + }, + cause: ~, + exc: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 709, + line: 26, + col: 15, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 722, + line: 26, + col: 28, + }, + }, + Format: "", + Value: "the session is unavailable because no secret key was set. Set the secret_key on the application to something unique and secret", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 709, + line: 26, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 721, + line: 26, + col: 27, + }, + }, + Name: "RuntimeError", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 671, + line: 25, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 675, + line: 25, + col: 19, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 671, + line: 25, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 675, + line: 25, + col: 19, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 686, + line: 25, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 692, + line: 25, + col: 36, + }, + }, + Init: ~, + MapVariadic: true, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 686, + line: 25, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 692, + line: 25, + col: 36, + }, + }, + Name: "kwargs", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 678, + line: 25, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 682, + line: 25, + col: 26, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 678, + line: 25, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 682, + line: 25, + col: 26, + }, + }, + Name: "args", + }, + Receiver: false, + Type: ~, + Variadic: true, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 917, + line: 29, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 917, + line: 29, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 928, + line: 29, + col: 16, + }, + }, + Name: "__setitem__", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 931, + line: 29, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 942, + line: 29, + col: 30, + }, + }, + Name: "__delitem__", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 945, + line: 29, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 950, + line: 29, + col: 38, + }, + }, + Name: "clear", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 953, + line: 29, + col: 41, + }, + end: { '@type': "uast:Position", + offset: 956, + line: 29, + col: 44, + }, + }, + Name: "pop", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 959, + line: 29, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 966, + line: 29, + col: 54, + }, + }, + Name: "popitem", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 979, + line: 30, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 985, + line: 30, + col: 15, + }, + }, + Name: "update", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 988, + line: 30, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 998, + line: 30, + col: 28, + }, + }, + Name: "setdefault", + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1001, + line: 30, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 1006, + line: 30, + col: 36, + }, + }, + Name: "_fail", + }, + }, + { '@type': "Delete", + '@token': "del", + '@role': [Incomplete, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1011, + line: 31, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1014, + line: 31, + col: 8, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1015, + line: 31, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1020, + line: 31, + col: 14, + }, + }, + Name: "_fail", + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_133_dst.uast b/uast/diff/testdata/testcase_133_dst.uast new file mode 100644 index 00000000..7775525f --- /dev/null +++ b/uast/diff/testdata/testcase_133_dst.uast @@ -0,0 +1,1088 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 242, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 245, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask.session\n ~~~~~~~~~~~~~\n\n Implements cookie based sessions based on Werkzeug's secure cookie\n system.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 247, + line: 13, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "SecureCookie", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.contrib.securecookie", + }, + Target: ~, + }, + { '@type': "ClassDef", + '@token': "Session", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 310, + line: 16, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 317, + line: 16, + col: 14, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 318, + line: 16, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 330, + line: 16, + col: 27, + }, + }, + Name: "SecureCookie", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 437, + line: 19, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 337, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 444, + line: 19, + col: 8, + }, + }, + Format: "", + Value: "Expands the session with support for switching between permanent\n and non-permanent sessions.\n ", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 454, + line: 21, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 468, + line: 21, + col: 23, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_get_permanent", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 484, + line: 22, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 490, + line: 22, + col: 15, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 491, + line: 22, + col: 16, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 500, + line: 22, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 512, + line: 22, + col: 37, + }, + }, + Format: "", + Value: "_permanent", + }, + { '@type': "BoolLiteral", + '@token': "False", + '@role': [Argument, Boolean, Call, Expression, Function, Literal, Name, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 514, + line: 22, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 519, + line: 22, + col: 44, + }, + }, + value: false, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 492, + line: 22, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 496, + line: 22, + col: 21, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 491, + line: 22, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 495, + line: 22, + col: 20, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 491, + line: 22, + col: 16, + }, + }, + Name: "get", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 469, + line: 21, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 473, + line: 21, + col: 28, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 469, + line: 21, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 473, + line: 21, + col: 28, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 530, + line: 24, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 544, + line: 24, + col: 23, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_set_permanent", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 567, + line: 25, + col: 9, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 567, + line: 25, + col: 9, + }, + }, + ctx: "Store", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 572, + line: 25, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 584, + line: 25, + col: 26, + }, + }, + Format: "", + Value: "_permanent", + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 567, + line: 25, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 571, + line: 25, + col: 13, + }, + }, + Name: "self", + }, + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 588, + line: 25, + col: 30, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 593, + line: 25, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 598, + line: 25, + col: 40, + }, + }, + Name: "value", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 588, + line: 25, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 592, + line: 25, + col: 34, + }, + }, + Name: "bool", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 545, + line: 24, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 549, + line: 24, + col: 28, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 545, + line: 24, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 549, + line: 24, + col: 28, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 551, + line: 24, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 556, + line: 24, + col: 35, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 551, + line: 24, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 556, + line: 24, + col: 35, + }, + }, + Name: "value", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 605, + line: 27, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 605, + line: 27, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 614, + line: 27, + col: 14, + }, + }, + Name: "permanent", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 617, + line: 27, + col: 17, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 626, + line: 27, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 640, + line: 27, + col: 40, + }, + }, + Name: "_get_permanent", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 642, + line: 27, + col: 42, + }, + end: { '@type': "uast:Position", + offset: 656, + line: 27, + col: 56, + }, + }, + Name: "_set_permanent", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 617, + line: 27, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 625, + line: 27, + col: 25, + }, + }, + Name: "property", + }, + keywords: [], + }, + }, + { '@type': "Delete", + '@token': "del", + '@role': [Incomplete, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 662, + line: 28, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 665, + line: 28, + col: 8, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 666, + line: 28, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 680, + line: 28, + col: 23, + }, + }, + Name: "_get_permanent", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 682, + line: 28, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 696, + line: 28, + col: 39, + }, + }, + Name: "_set_permanent", + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "ClassDef", + '@token': "_NullSession", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 705, + line: 31, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 717, + line: 31, + col: 19, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 718, + line: 31, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 725, + line: 31, + col: 27, + }, + }, + Name: "Session", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 895, + line: 35, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 732, + line: 32, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 902, + line: 35, + col: 8, + }, + }, + Format: "", + Value: "Class used to generate nicer error messages if sessions are not\n available. Will still allow read-only access to the empty session\n but fail on setting.\n ", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 912, + line: 37, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 917, + line: 37, + col: 14, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_fail", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Raise", + '@token': "raise", + '@role': [Statement, Throw], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 950, + line: 38, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 955, + line: 38, + col: 14, + }, + }, + cause: ~, + exc: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 956, + line: 38, + col: 15, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 969, + line: 38, + col: 28, + }, + }, + Format: "", + Value: "the session is unavailable because no secret key was set. Set the secret_key on the application to something unique and secret.", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 956, + line: 38, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 968, + line: 38, + col: 27, + }, + }, + Name: "RuntimeError", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 918, + line: 37, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 922, + line: 37, + col: 19, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 918, + line: 37, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 922, + line: 37, + col: 19, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 933, + line: 37, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 939, + line: 37, + col: 36, + }, + }, + Init: ~, + MapVariadic: true, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 933, + line: 37, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 939, + line: 37, + col: 36, + }, + }, + Name: "kwargs", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 925, + line: 37, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 929, + line: 37, + col: 26, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 925, + line: 37, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 929, + line: 37, + col: 26, + }, + }, + Name: "args", + }, + Receiver: false, + Type: ~, + Variadic: true, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1165, + line: 41, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1165, + line: 41, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1176, + line: 41, + col: 16, + }, + }, + Name: "__setitem__", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1179, + line: 41, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 1190, + line: 41, + col: 30, + }, + }, + Name: "__delitem__", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1193, + line: 41, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 1198, + line: 41, + col: 38, + }, + }, + Name: "clear", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1201, + line: 41, + col: 41, + }, + end: { '@type': "uast:Position", + offset: 1204, + line: 41, + col: 44, + }, + }, + Name: "pop", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1207, + line: 41, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 1214, + line: 41, + col: 54, + }, + }, + Name: "popitem", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1227, + line: 42, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1233, + line: 42, + col: 15, + }, + }, + Name: "update", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1236, + line: 42, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 1246, + line: 42, + col: 28, + }, + }, + Name: "setdefault", + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1249, + line: 42, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 1254, + line: 42, + col: 36, + }, + }, + Name: "_fail", + }, + }, + { '@type': "Delete", + '@token': "del", + '@role': [Incomplete, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1259, + line: 43, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1262, + line: 43, + col: 8, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1263, + line: 43, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1268, + line: 43, + col: 14, + }, + }, + Name: "_fail", + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_133_src.uast b/uast/diff/testdata/testcase_133_src.uast new file mode 100644 index 00000000..a95fa1cf --- /dev/null +++ b/uast/diff/testdata/testcase_133_src.uast @@ -0,0 +1,1088 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 242, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 245, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask.session\n ~~~~~~~~~~~~~\n\n Implements cookie based sessions based on Werkzeug's secure cookie\n system.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 247, + line: 13, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "SecureCookie", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.contrib.securecookie", + }, + Target: ~, + }, + { '@type': "ClassDef", + '@token': "Session", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 310, + line: 16, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 317, + line: 16, + col: 14, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 318, + line: 16, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 330, + line: 16, + col: 27, + }, + }, + Name: "SecureCookie", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 437, + line: 19, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 337, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 444, + line: 19, + col: 8, + }, + }, + Format: "", + Value: "Expands the session with support for switching between permanent\n and non-permanent sessions.\n ", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 454, + line: 21, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 468, + line: 21, + col: 23, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_get_permanent", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 484, + line: 22, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 490, + line: 22, + col: 15, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 491, + line: 22, + col: 16, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 500, + line: 22, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 512, + line: 22, + col: 37, + }, + }, + Format: "", + Value: "_permanent", + }, + { '@type': "BoolLiteral", + '@token': "False", + '@role': [Argument, Boolean, Call, Expression, Function, Literal, Name, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 514, + line: 22, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 519, + line: 22, + col: 44, + }, + }, + value: false, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 492, + line: 22, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 496, + line: 22, + col: 21, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 491, + line: 22, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 495, + line: 22, + col: 20, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 491, + line: 22, + col: 16, + }, + }, + Name: "get", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 469, + line: 21, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 473, + line: 21, + col: 28, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 469, + line: 21, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 473, + line: 21, + col: 28, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 530, + line: 24, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 544, + line: 24, + col: 23, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_set_permanent", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 567, + line: 25, + col: 9, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 567, + line: 25, + col: 9, + }, + }, + ctx: "Store", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 572, + line: 25, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 584, + line: 25, + col: 26, + }, + }, + Format: "", + Value: "_permanent", + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 567, + line: 25, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 571, + line: 25, + col: 13, + }, + }, + Name: "self", + }, + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 588, + line: 25, + col: 30, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 593, + line: 25, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 598, + line: 25, + col: 40, + }, + }, + Name: "value", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 588, + line: 25, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 592, + line: 25, + col: 34, + }, + }, + Name: "bool", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 545, + line: 24, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 549, + line: 24, + col: 28, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 545, + line: 24, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 549, + line: 24, + col: 28, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 551, + line: 24, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 556, + line: 24, + col: 35, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 551, + line: 24, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 556, + line: 24, + col: 35, + }, + }, + Name: "value", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 605, + line: 27, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 605, + line: 27, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 614, + line: 27, + col: 14, + }, + }, + Name: "permanent", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 617, + line: 27, + col: 17, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 626, + line: 27, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 640, + line: 27, + col: 40, + }, + }, + Name: "_get_permanent", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 642, + line: 27, + col: 42, + }, + end: { '@type': "uast:Position", + offset: 656, + line: 27, + col: 56, + }, + }, + Name: "_set_permanent", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 617, + line: 27, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 625, + line: 27, + col: 25, + }, + }, + Name: "property", + }, + keywords: [], + }, + }, + { '@type': "Delete", + '@token': "del", + '@role': [Incomplete, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 662, + line: 28, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 665, + line: 28, + col: 8, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 666, + line: 28, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 680, + line: 28, + col: 23, + }, + }, + Name: "_get_permanent", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 682, + line: 28, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 696, + line: 28, + col: 39, + }, + }, + Name: "_set_permanent", + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "ClassDef", + '@token': "_NullSession", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 705, + line: 31, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 717, + line: 31, + col: 19, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 718, + line: 31, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 725, + line: 31, + col: 27, + }, + }, + Name: "Session", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 895, + line: 35, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 732, + line: 32, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 902, + line: 35, + col: 8, + }, + }, + Format: "", + Value: "Class used to generate nicer error messages if sessions are not\n available. Will still allow read-only access to the empty session\n but fail on setting.\n ", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 912, + line: 37, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 917, + line: 37, + col: 14, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_fail", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Raise", + '@token': "raise", + '@role': [Statement, Throw], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 950, + line: 38, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 955, + line: 38, + col: 14, + }, + }, + cause: ~, + exc: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 956, + line: 38, + col: 15, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 969, + line: 38, + col: 28, + }, + }, + Format: "", + Value: "the session is unavailable because no secret key was set. Set the secret_key on the application to something unique and secret", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 956, + line: 38, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 968, + line: 38, + col: 27, + }, + }, + Name: "RuntimeError", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 918, + line: 37, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 922, + line: 37, + col: 19, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 918, + line: 37, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 922, + line: 37, + col: 19, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 933, + line: 37, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 939, + line: 37, + col: 36, + }, + }, + Init: ~, + MapVariadic: true, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 933, + line: 37, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 939, + line: 37, + col: 36, + }, + }, + Name: "kwargs", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 925, + line: 37, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 929, + line: 37, + col: 26, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 925, + line: 37, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 929, + line: 37, + col: 26, + }, + }, + Name: "args", + }, + Receiver: false, + Type: ~, + Variadic: true, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1164, + line: 41, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1164, + line: 41, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1175, + line: 41, + col: 16, + }, + }, + Name: "__setitem__", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1178, + line: 41, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 1189, + line: 41, + col: 30, + }, + }, + Name: "__delitem__", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1192, + line: 41, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 1197, + line: 41, + col: 38, + }, + }, + Name: "clear", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1200, + line: 41, + col: 41, + }, + end: { '@type': "uast:Position", + offset: 1203, + line: 41, + col: 44, + }, + }, + Name: "pop", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1206, + line: 41, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 1213, + line: 41, + col: 54, + }, + }, + Name: "popitem", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1226, + line: 42, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1232, + line: 42, + col: 15, + }, + }, + Name: "update", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1235, + line: 42, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 1245, + line: 42, + col: 28, + }, + }, + Name: "setdefault", + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1248, + line: 42, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 1253, + line: 42, + col: 36, + }, + }, + Name: "_fail", + }, + }, + { '@type': "Delete", + '@token': "del", + '@role': [Incomplete, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1258, + line: 43, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1261, + line: 43, + col: 8, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1262, + line: 43, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1267, + line: 43, + col: 14, + }, + }, + Name: "_fail", + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_134_dst.uast b/uast/diff/testdata/testcase_134_dst.uast new file mode 100644 index 00000000..914db487 --- /dev/null +++ b/uast/diff/testdata/testcase_134_dst.uast @@ -0,0 +1,1504 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 205, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 208, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n flask.logging\n ~~~~~~~~~~~~~\n\n Implements the logging support for Flask.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 210, + line: 12, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 225, + line: 12, + col: 16, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "absolute_import", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "__future__", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 250, + line: 14, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 262, + line: 14, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "getLogger", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "StreamHandler", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Formatter", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "getLoggerClass", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "DEBUG", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "logging", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 335, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 348, + line: 17, + col: 18, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "create_logger", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 670, + line: 23, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 359, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 677, + line: 23, + col: 8, + }, + }, + Format: "", + Value: "Creates a logger for the given application. This logger works\n similar to a regular Python logger but changes the effective logging\n level based on the application's debug flag. Furthermore this\n function also removes all attached handlers in case there was a\n logger with the log name before.\n ", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 682, + line: 24, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 682, + line: 24, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 688, + line: 24, + col: 11, + }, + }, + Name: "Logger", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 691, + line: 24, + col: 14, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 691, + line: 24, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 705, + line: 24, + col: 28, + }, + }, + Name: "getLoggerClass", + }, + keywords: [], + }, + }, + { '@type': "ClassDef", + '@token': "DebugLogger", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 719, + line: 26, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 730, + line: 26, + col: 22, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 731, + line: 26, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 737, + line: 26, + col: 29, + }, + }, + Name: "Logger", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 752, + line: 27, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 769, + line: 27, + col: 30, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "getEffectiveLevel", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 786, + line: 28, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 792, + line: 28, + col: 19, + }, + }, + value: { '@type': "IfExp", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 793, + line: 28, + col: 20, + }, + }, + body: { '@type': "uast:Identifier", + '@role': [Body, If, Then], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 793, + line: 28, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 798, + line: 28, + col: 25, + }, + }, + Name: "DEBUG", + }, + orelse: { '@type': "Call", + '@role': [Body, Call, Else, Expression, Function, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 817, + line: 28, + col: 44, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 842, + line: 28, + col: 69, + }, + end: { '@type': "uast:Position", + offset: 843, + line: 28, + col: 70, + }, + }, + Name: "x", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 818, + line: 28, + col: 45, + }, + end: { '@type': "uast:Position", + offset: 824, + line: 28, + col: 51, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 817, + line: 28, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 823, + line: 28, + col: 50, + }, + }, + Name: "Logger", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 817, + line: 28, + col: 44, + }, + }, + Name: "getEffectiveLevel", + }, + ], + }, + keywords: [], + }, + test: { '@type': "QualifiedIdentifier", + '@role': [Condition, Expression, Identifier, If, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 803, + line: 28, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 806, + line: 28, + col: 33, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 802, + line: 28, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 805, + line: 28, + col: 32, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 802, + line: 28, + col: 29, + }, + }, + Name: "debug", + }, + ], + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 770, + line: 27, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 771, + line: 27, + col: 32, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 770, + line: 27, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 771, + line: 27, + col: 32, + }, + }, + Name: "x", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "ClassDef", + '@token': "DebugHandler", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 856, + line: 30, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 868, + line: 30, + col: 23, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 869, + line: 30, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 882, + line: 30, + col: 37, + }, + }, + Name: "StreamHandler", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 897, + line: 31, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 901, + line: 31, + col: 17, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "emit", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 926, + line: 32, + col: 13, + }, + }, + value: { '@type': "IfExp", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 926, + line: 32, + col: 13, + }, + }, + body: { '@type': "Call", + '@role': [Body, Call, Expression, Function, If, Then], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 926, + line: 32, + col: 13, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 945, + line: 32, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 946, + line: 32, + col: 33, + }, + }, + Name: "x", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 948, + line: 32, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 954, + line: 32, + col: 41, + }, + }, + Name: "record", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 927, + line: 32, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 940, + line: 32, + col: 27, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 926, + line: 32, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 939, + line: 32, + col: 26, + }, + }, + Name: "StreamHandler", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 926, + line: 32, + col: 13, + }, + }, + Name: "emit", + }, + ], + }, + keywords: [], + }, + orelse: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Body, Else, Expression, If, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 974, + line: 32, + col: 61, + }, + end: { '@type': "uast:Position", + offset: 978, + line: 32, + col: 65, + }, + }, + LiteralValue: "None", + value: ~, + }, + test: { '@type': "QualifiedIdentifier", + '@role': [Condition, Expression, Identifier, If, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 960, + line: 32, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 963, + line: 32, + col: 50, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 959, + line: 32, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 962, + line: 32, + col: 49, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 959, + line: 32, + col: 46, + }, + }, + Name: "debug", + }, + ], + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 902, + line: 31, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 903, + line: 31, + col: 19, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 902, + line: 31, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 903, + line: 31, + col: 19, + }, + }, + Name: "x", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 905, + line: 31, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 911, + line: 31, + col: 27, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 905, + line: 31, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 911, + line: 31, + col: 27, + }, + }, + Name: "record", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 984, + line: 34, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 984, + line: 34, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 991, + line: 34, + col: 12, + }, + }, + Name: "handler", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 994, + line: 34, + col: 15, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 994, + line: 34, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 1006, + line: 34, + col: 27, + }, + }, + Name: "DebugHandler", + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1013, + line: 35, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1013, + line: 35, + col: 5, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1030, + line: 35, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 1035, + line: 35, + col: 27, + }, + }, + Name: "DEBUG", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1014, + line: 35, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 1021, + line: 35, + col: 13, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1013, + line: 35, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1020, + line: 35, + col: 12, + }, + }, + Name: "handler", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1013, + line: 35, + col: 5, + }, + }, + Name: "setLevel", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1041, + line: 36, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1041, + line: 36, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1062, + line: 36, + col: 26, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1073, + line: 36, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 1076, + line: 36, + col: 40, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1072, + line: 36, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 1075, + line: 36, + col: 39, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1072, + line: 36, + col: 36, + }, + }, + Name: "debug_log_format", + }, + ], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1062, + line: 36, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 1071, + line: 36, + col: 35, + }, + }, + Name: "Formatter", + }, + keywords: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1042, + line: 36, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 1049, + line: 36, + col: 13, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1041, + line: 36, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1048, + line: 36, + col: 12, + }, + }, + Name: "handler", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1041, + line: 36, + col: 5, + }, + }, + Name: "setFormatter", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1099, + line: 37, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1099, + line: 37, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1105, + line: 37, + col: 11, + }, + }, + Name: "logger", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1108, + line: 37, + col: 14, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1119, + line: 37, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 1122, + line: 37, + col: 28, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1118, + line: 37, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 1121, + line: 37, + col: 27, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1118, + line: 37, + col: 24, + }, + }, + Name: "logger_name", + }, + ], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1108, + line: 37, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 1117, + line: 37, + col: 23, + }, + }, + Name: "getLogger", + }, + keywords: [], + }, + }, + { '@type': "Delete", + '@token': "del", + '@role': [Incomplete, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1243, + line: 40, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1246, + line: 40, + col: 8, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1247, + line: 40, + col: 9, + }, + }, + ctx: "Del", + slice: { '@type': "Slice", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + lower: ~, + step: ~, + upper: ~, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1248, + line: 40, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 1254, + line: 40, + col: 16, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1247, + line: 40, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1253, + line: 40, + col: 15, + }, + }, + Name: "logger", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1247, + line: 40, + col: 9, + }, + }, + Name: "handlers", + }, + ], + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1270, + line: 41, + col: 5, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1271, + line: 41, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 1277, + line: 41, + col: 12, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1270, + line: 41, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1276, + line: 41, + col: 11, + }, + }, + Name: "logger", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1270, + line: 41, + col: 5, + }, + }, + Name: "__class__", + }, + ], + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1289, + line: 41, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 1300, + line: 41, + col: 35, + }, + }, + Name: "DebugLogger", + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1305, + line: 42, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1305, + line: 42, + col: 5, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1323, + line: 42, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 1330, + line: 42, + col: 30, + }, + }, + Name: "handler", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1306, + line: 42, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 1312, + line: 42, + col: 12, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1305, + line: 42, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1311, + line: 42, + col: 11, + }, + }, + Name: "logger", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1305, + line: 42, + col: 5, + }, + }, + Name: "addHandler", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1336, + line: 43, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1342, + line: 43, + col: 11, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1343, + line: 43, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 1349, + line: 43, + col: 18, + }, + }, + Name: "logger", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 349, + line: 17, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 352, + line: 17, + col: 22, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 349, + line: 17, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 352, + line: 17, + col: 22, + }, + }, + Name: "app", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_134_src.uast b/uast/diff/testdata/testcase_134_src.uast new file mode 100644 index 00000000..13751a15 --- /dev/null +++ b/uast/diff/testdata/testcase_134_src.uast @@ -0,0 +1,1448 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 205, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 208, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n flask.logging\n ~~~~~~~~~~~~~\n\n Implements the logging support for Flask.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 210, + line: 12, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 225, + line: 12, + col: 16, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "absolute_import", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "__future__", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 250, + line: 14, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 262, + line: 14, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "getLogger", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "StreamHandler", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Formatter", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Logger", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "DEBUG", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "logging", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 327, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 340, + line: 17, + col: 18, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "create_logger", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 662, + line: 23, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 351, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 669, + line: 23, + col: 8, + }, + }, + Format: "", + Value: "Creates a logger for the given application. This logger works\n similar to a regular Python logger but changes the effective logging\n level based on the application's debug flag. Furthermore this\n function also removes all attached handlers in case there was a\n logger with the log name before.\n ", + }, + }, + { '@type': "ClassDef", + '@token': "DebugLogger", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 681, + line: 25, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 692, + line: 25, + col: 22, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 693, + line: 25, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 699, + line: 25, + col: 29, + }, + }, + Name: "Logger", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 714, + line: 26, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 731, + line: 26, + col: 30, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "getEffectiveLevel", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 748, + line: 27, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 754, + line: 27, + col: 19, + }, + }, + value: { '@type': "IfExp", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 755, + line: 27, + col: 20, + }, + }, + body: { '@type': "uast:Identifier", + '@role': [Body, If, Then], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 755, + line: 27, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 760, + line: 27, + col: 25, + }, + }, + Name: "DEBUG", + }, + orelse: { '@type': "Call", + '@role': [Body, Call, Else, Expression, Function, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 779, + line: 27, + col: 44, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 804, + line: 27, + col: 69, + }, + end: { '@type': "uast:Position", + offset: 805, + line: 27, + col: 70, + }, + }, + Name: "x", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 780, + line: 27, + col: 45, + }, + end: { '@type': "uast:Position", + offset: 786, + line: 27, + col: 51, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 779, + line: 27, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 785, + line: 27, + col: 50, + }, + }, + Name: "Logger", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 779, + line: 27, + col: 44, + }, + }, + Name: "getEffectiveLevel", + }, + ], + }, + keywords: [], + }, + test: { '@type': "QualifiedIdentifier", + '@role': [Condition, Expression, Identifier, If, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 765, + line: 27, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 768, + line: 27, + col: 33, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 764, + line: 27, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 767, + line: 27, + col: 32, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 764, + line: 27, + col: 29, + }, + }, + Name: "debug", + }, + ], + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 732, + line: 26, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 733, + line: 26, + col: 32, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 732, + line: 26, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 733, + line: 26, + col: 32, + }, + }, + Name: "x", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "ClassDef", + '@token': "DebugHandler", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 818, + line: 29, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 830, + line: 29, + col: 23, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 831, + line: 29, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 844, + line: 29, + col: 37, + }, + }, + Name: "StreamHandler", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 859, + line: 30, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 863, + line: 30, + col: 17, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "emit", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 31, + col: 13, + }, + }, + value: { '@type': "IfExp", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 31, + col: 13, + }, + }, + body: { '@type': "Call", + '@role': [Body, Call, Expression, Function, If, Then], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 31, + col: 13, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 907, + line: 31, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 908, + line: 31, + col: 33, + }, + }, + Name: "x", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 910, + line: 31, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 916, + line: 31, + col: 41, + }, + }, + Name: "record", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 889, + line: 31, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 902, + line: 31, + col: 27, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 31, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 901, + line: 31, + col: 26, + }, + }, + Name: "StreamHandler", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 31, + col: 13, + }, + }, + Name: "emit", + }, + ], + }, + keywords: [], + }, + orelse: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Body, Else, Expression, If, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 936, + line: 31, + col: 61, + }, + end: { '@type': "uast:Position", + offset: 940, + line: 31, + col: 65, + }, + }, + LiteralValue: "None", + value: ~, + }, + test: { '@type': "QualifiedIdentifier", + '@role': [Condition, Expression, Identifier, If, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 922, + line: 31, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 925, + line: 31, + col: 50, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 921, + line: 31, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 924, + line: 31, + col: 49, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 921, + line: 31, + col: 46, + }, + }, + Name: "debug", + }, + ], + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 864, + line: 30, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 865, + line: 30, + col: 19, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 864, + line: 30, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 865, + line: 30, + col: 19, + }, + }, + Name: "x", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 867, + line: 30, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 873, + line: 30, + col: 27, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 867, + line: 30, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 873, + line: 30, + col: 27, + }, + }, + Name: "record", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 946, + line: 33, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 946, + line: 33, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 953, + line: 33, + col: 12, + }, + }, + Name: "handler", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 956, + line: 33, + col: 15, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 956, + line: 33, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 968, + line: 33, + col: 27, + }, + }, + Name: "DebugHandler", + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 975, + line: 34, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 975, + line: 34, + col: 5, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 992, + line: 34, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 997, + line: 34, + col: 27, + }, + }, + Name: "DEBUG", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 976, + line: 34, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 983, + line: 34, + col: 13, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 975, + line: 34, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 982, + line: 34, + col: 12, + }, + }, + Name: "handler", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 975, + line: 34, + col: 5, + }, + }, + Name: "setLevel", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1003, + line: 35, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1003, + line: 35, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1024, + line: 35, + col: 26, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1035, + line: 35, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 1038, + line: 35, + col: 40, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1034, + line: 35, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 1037, + line: 35, + col: 39, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1034, + line: 35, + col: 36, + }, + }, + Name: "debug_log_format", + }, + ], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1024, + line: 35, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 1033, + line: 35, + col: 35, + }, + }, + Name: "Formatter", + }, + keywords: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1004, + line: 35, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 1011, + line: 35, + col: 13, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1003, + line: 35, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1010, + line: 35, + col: 12, + }, + }, + Name: "handler", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1003, + line: 35, + col: 5, + }, + }, + Name: "setFormatter", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1061, + line: 36, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1061, + line: 36, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1067, + line: 36, + col: 11, + }, + }, + Name: "logger", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1070, + line: 36, + col: 14, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1081, + line: 36, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 1084, + line: 36, + col: 28, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1080, + line: 36, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 1083, + line: 36, + col: 27, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1080, + line: 36, + col: 24, + }, + }, + Name: "logger_name", + }, + ], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1070, + line: 36, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 1079, + line: 36, + col: 23, + }, + }, + Name: "getLogger", + }, + keywords: [], + }, + }, + { '@type': "Delete", + '@token': "del", + '@role': [Incomplete, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1205, + line: 39, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1208, + line: 39, + col: 8, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1209, + line: 39, + col: 9, + }, + }, + ctx: "Del", + slice: { '@type': "Slice", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + lower: ~, + step: ~, + upper: ~, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1210, + line: 39, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 1216, + line: 39, + col: 16, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1209, + line: 39, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1215, + line: 39, + col: 15, + }, + }, + Name: "logger", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1209, + line: 39, + col: 9, + }, + }, + Name: "handlers", + }, + ], + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1232, + line: 40, + col: 5, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1233, + line: 40, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 1239, + line: 40, + col: 12, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1232, + line: 40, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1238, + line: 40, + col: 11, + }, + }, + Name: "logger", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1232, + line: 40, + col: 5, + }, + }, + Name: "__class__", + }, + ], + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1251, + line: 40, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 1262, + line: 40, + col: 35, + }, + }, + Name: "DebugLogger", + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1267, + line: 41, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1267, + line: 41, + col: 5, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1285, + line: 41, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 1292, + line: 41, + col: 30, + }, + }, + Name: "handler", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1268, + line: 41, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 1274, + line: 41, + col: 12, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1267, + line: 41, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1273, + line: 41, + col: 11, + }, + }, + Name: "logger", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1267, + line: 41, + col: 5, + }, + }, + Name: "addHandler", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1298, + line: 42, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1304, + line: 42, + col: 11, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1305, + line: 42, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 1311, + line: 42, + col: 18, + }, + }, + Name: "logger", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 341, + line: 17, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 344, + line: 17, + col: 22, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 341, + line: 17, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 344, + line: 17, + col: 22, + }, + }, + Name: "app", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_135_dst.uast b/uast/diff/testdata/testcase_135_dst.uast new file mode 100644 index 00000000..fba6d60a --- /dev/null +++ b/uast/diff/testdata/testcase_135_dst.uast @@ -0,0 +1,1494 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 215, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 218, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n flask.module\n ~~~~~~~~~~~~\n\n Implements a class that represents module blueprints.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 220, + line: 12, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "os", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 219, + line: 11, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 219, + line: 11, + col: 1, + }, + }, + lines: [], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 231, + line: 14, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 244, + line: 14, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_PackageBoundObject", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_endpoint_from_view_func", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 298, + line: 15, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 314, + line: 15, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 338, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 357, + line: 18, + col: 24, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "blueprint_is_module", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 367, + line: 19, + col: 5, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 367, + line: 19, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 425, + line: 19, + col: 63, + }, + }, + Format: "", + Value: "Used to figure out if something is actually a module", + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 430, + line: 20, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 436, + line: 20, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 437, + line: 20, + col: 12, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 448, + line: 20, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 450, + line: 20, + col: 25, + }, + }, + Name: "bp", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 452, + line: 20, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 458, + line: 20, + col: 33, + }, + }, + Name: "Module", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 437, + line: 20, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 447, + line: 20, + col: 22, + }, + }, + Name: "isinstance", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 358, + line: 18, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 360, + line: 18, + col: 27, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 358, + line: 18, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 360, + line: 18, + col: 27, + }, + }, + Name: "bp", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "ClassDef", + '@token': "Module", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 468, + line: 23, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 474, + line: 23, + col: 13, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 475, + line: 23, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 484, + line: 23, + col: 23, + }, + }, + Name: "Blueprint", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 847, + line: 31, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 491, + line: 24, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 854, + line: 31, + col: 8, + }, + }, + Format: "", + Value: "Deprecated module support. Until Flask 0.6 modules were a different\n name of the concept now available as blueprints in Flask. They are\n essentially doing the same but have some bad semantics for templates and\n static files that were fixed with blueprints.\n\n .. versionchanged:: 0.7\n Modules were deprecated in favor for blueprints.\n ", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 864, + line: 33, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 872, + line: 33, + col: 17, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "__init__", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 980, + line: 35, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 982, + line: 35, + col: 11, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1009, + line: 36, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1015, + line: 36, + col: 19, + }, + }, + msg: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1036, + line: 36, + col: 40, + }, + }, + Format: "", + Value: "name required if package name does not point to a submodule", + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1016, + line: 36, + col: 20, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1023, + line: 36, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 1034, + line: 36, + col: 38, + }, + }, + Name: "import_name", + }, + ], + }, + left: { '@type': "uast:String", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1016, + line: 36, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 1019, + line: 36, + col: 23, + }, + }, + Format: "", + Value: ".", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "In", + '@token': "in", + '@role': [Contains, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1131, + line: 38, + col: 13, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1131, + line: 38, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1135, + line: 38, + col: 17, + }, + }, + Name: "name", + }, + ], + value: { '@type': "Subscript", + '@role': [Expression, Incomplete, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1138, + line: 38, + col: 20, + }, + }, + ctx: "Load", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "Num", + '@token': 1, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1165, + line: 38, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 1166, + line: 38, + col: 48, + }, + }, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1138, + line: 38, + col: 20, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1149, + line: 38, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 1150, + line: 38, + col: 32, + }, + }, + Format: "", + Value: ".", + }, + { '@type': "Num", + '@token': 1, + '@role': [Argument, Call, Expression, Function, Literal, Name, Number, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1162, + line: 38, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 1163, + line: 38, + col: 45, + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1139, + line: 38, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 1150, + line: 38, + col: 32, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1138, + line: 38, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 1149, + line: 38, + col: 31, + }, + }, + Name: "import_name", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1138, + line: 38, + col: 20, + }, + }, + Name: "rsplit", + }, + ], + }, + keywords: [], + }, + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 983, + line: 35, + col: 12, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 991, + line: 35, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 995, + line: 35, + col: 24, + }, + }, + LiteralValue: "None", + value: ~, + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 983, + line: 35, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 987, + line: 35, + col: 16, + }, + }, + Name: "name", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Is", + '@token': "is", + '@role': [Identical, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1176, + line: 39, + col: 9, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1176, + line: 39, + col: 9, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1195, + line: 39, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 1199, + line: 39, + col: 32, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1201, + line: 39, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 1205, + line: 39, + col: 38, + }, + }, + Name: "name", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1207, + line: 39, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 1218, + line: 39, + col: 51, + }, + }, + Name: "import_name", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1177, + line: 39, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 1186, + line: 39, + col: 19, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1176, + line: 39, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1185, + line: 39, + col: 18, + }, + }, + Name: "Blueprint", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1176, + line: 39, + col: 9, + }, + }, + Name: "__init__", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "url_prefix", + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1220, + line: 39, + col: 53, + }, + end: { '@type': "uast:Position", + offset: 1230, + line: 39, + col: 63, + }, + }, + Name: "url_prefix", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "subdomain", + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1270, + line: 40, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 1279, + line: 40, + col: 37, + }, + }, + Name: "subdomain", + }, + }, + ], + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1300, + line: 42, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1302, + line: 42, + col: 11, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1370, + line: 43, + col: 13, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1371, + line: 43, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 1375, + line: 43, + col: 18, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1370, + line: 43, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1374, + line: 43, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1370, + line: 43, + col: 13, + }, + }, + Name: "_static_folder", + }, + ], + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1392, + line: 43, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 1400, + line: 43, + col: 43, + }, + }, + Format: "", + Value: "static", + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Call", + '@role': [Call, Condition, Expression, Function, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1303, + line: 42, + col: 12, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1317, + line: 42, + col: 26, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1331, + line: 42, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 1335, + line: 42, + col: 44, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1330, + line: 42, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 1334, + line: 42, + col: 43, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1330, + line: 42, + col: 39, + }, + }, + Name: "root_path", + }, + ], + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1346, + line: 42, + col: 55, + }, + end: { '@type': "uast:Position", + offset: 1354, + line: 42, + col: 63, + }, + }, + Format: "", + Value: "static", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1318, + line: 42, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 1320, + line: 42, + col: 29, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1317, + line: 42, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 1319, + line: 42, + col: 28, + }, + }, + Name: "os", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1320, + line: 42, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 1324, + line: 42, + col: 33, + }, + }, + Name: "path", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1317, + line: 42, + col: 26, + }, + }, + Name: "join", + }, + ], + }, + keywords: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1304, + line: 42, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1306, + line: 42, + col: 15, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1303, + line: 42, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 1305, + line: 42, + col: 14, + }, + }, + Name: "os", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1306, + line: 42, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 1310, + line: 42, + col: 19, + }, + }, + Name: "path", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1303, + line: 42, + col: 12, + }, + }, + Name: "isdir", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 873, + line: 33, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 877, + line: 33, + col: 22, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 873, + line: 33, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 877, + line: 33, + col: 22, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 879, + line: 33, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 890, + line: 33, + col: 35, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 879, + line: 33, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 890, + line: 33, + col: 35, + }, + }, + Name: "import_name", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 892, + line: 33, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 896, + line: 33, + col: 41, + }, + }, + Init: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 897, + line: 33, + col: 42, + }, + end: { '@type': "uast:Position", + offset: 901, + line: 33, + col: 46, + }, + }, + LiteralValue: "None", + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 855, + line: 32, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 855, + line: 32, + col: 1, + }, + }, + lines: [], + }, + value: ~, + }, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 892, + line: 33, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 896, + line: 33, + col: 41, + }, + }, + Name: "name", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 903, + line: 33, + col: 48, + }, + end: { '@type': "uast:Position", + offset: 913, + line: 33, + col: 58, + }, + }, + Init: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 914, + line: 33, + col: 59, + }, + end: { '@type': "uast:Position", + offset: 918, + line: 33, + col: 63, + }, + }, + LiteralValue: "None", + value: ~, + }, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 903, + line: 33, + col: 48, + }, + end: { '@type': "uast:Position", + offset: 913, + line: 33, + col: 58, + }, + }, + Name: "url_prefix", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 937, + line: 34, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 948, + line: 34, + col: 29, + }, + }, + Init: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 949, + line: 34, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 953, + line: 34, + col: 34, + }, + }, + LiteralValue: "None", + value: ~, + }, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 937, + line: 34, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 948, + line: 34, + col: 29, + }, + }, + Name: "static_path", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 955, + line: 34, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 964, + line: 34, + col: 45, + }, + }, + Init: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 965, + line: 34, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 969, + line: 34, + col: 50, + }, + }, + LiteralValue: "None", + value: ~, + }, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 955, + line: 34, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 964, + line: 34, + col: 45, + }, + }, + Name: "subdomain", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_135_src.uast b/uast/diff/testdata/testcase_135_src.uast new file mode 100644 index 00000000..a62016bb --- /dev/null +++ b/uast/diff/testdata/testcase_135_src.uast @@ -0,0 +1,8556 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 215, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 218, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n flask.module\n ~~~~~~~~~~~~\n\n Implements a class that represents module blueprints.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 220, + line: 12, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 233, + line: 12, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_PackageBoundObject", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_endpoint_from_view_func", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 293, + line: 15, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 309, + line: 15, + col: 21, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_register_module", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 559, + line: 20, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 336, + line: 16, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 566, + line: 20, + col: 8, + }, + }, + Format: "", + Value: "Internal helper function that returns a function for recording\n that registers the `send_static_file` function for the module on\n the application if necessary. It also registers the module on\n the application.\n ", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 575, + line: 21, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 584, + line: 21, + col: 18, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_register", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 601, + line: 22, + col: 9, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 601, + line: 22, + col: 9, + }, + }, + ctx: "Store", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 620, + line: 22, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 626, + line: 22, + col: 34, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 619, + line: 22, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 625, + line: 22, + col: 33, + }, + }, + Name: "module", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 619, + line: 22, + col: 27, + }, + }, + Name: "name", + }, + ], + }, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 602, + line: 22, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 607, + line: 22, + col: 15, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 601, + line: 22, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 606, + line: 22, + col: 14, + }, + }, + Name: "state", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 607, + line: 22, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 610, + line: 22, + col: 18, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 601, + line: 22, + col: 9, + }, + }, + Name: "modules", + }, + ], + }, + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 634, + line: 22, + col: 42, + }, + end: { '@type': "uast:Position", + offset: 640, + line: 22, + col: 48, + }, + }, + Name: "module", + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 774, + line: 25, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 776, + line: 25, + col: 11, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 830, + line: 26, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 836, + line: 26, + col: 19, + }, + }, + value: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 777, + line: 25, + col: 12, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 801, + line: 25, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 807, + line: 25, + col: 42, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 800, + line: 25, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 806, + line: 25, + col: 41, + }, + }, + Name: "module", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 800, + line: 25, + col: 35, + }, + }, + Name: "root_path", + }, + ], + }, + ], + }, + left: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 778, + line: 25, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 783, + line: 25, + col: 18, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 777, + line: 25, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 782, + line: 25, + col: 17, + }, + }, + Name: "state", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 783, + line: 25, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 786, + line: 25, + col: 21, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 777, + line: 25, + col: 12, + }, + }, + Name: "root_path", + }, + ], + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 845, + line: 27, + col: 9, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 845, + line: 27, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 849, + line: 27, + col: 13, + }, + }, + Name: "path", + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 852, + line: 27, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 863, + line: 27, + col: 27, + }, + }, + Name: "static_path", + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 872, + line: 28, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 874, + line: 28, + col: 11, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 901, + line: 29, + col: 13, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 901, + line: 29, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 905, + line: 29, + col: 17, + }, + }, + Name: "path", + }, + ], + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 909, + line: 29, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 914, + line: 29, + col: 26, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 908, + line: 29, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 913, + line: 29, + col: 25, + }, + }, + Name: "state", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 914, + line: 29, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 917, + line: 29, + col: 29, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 908, + line: 29, + col: 20, + }, + }, + Name: "static_path", + }, + ], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 875, + line: 28, + col: 12, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 883, + line: 28, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 887, + line: 28, + col: 24, + }, + }, + LiteralValue: "None", + value: ~, + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 875, + line: 28, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 879, + line: 28, + col: 16, + }, + }, + Name: "path", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Is", + '@token': "is", + '@role': [Identical, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 938, + line: 30, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 940, + line: 30, + col: 11, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 971, + line: 31, + col: 13, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 971, + line: 31, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 975, + line: 31, + col: 17, + }, + }, + Name: "path", + }, + ], + value: { '@type': "BinOp", + '@role': [Binary, Expression, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 978, + line: 31, + col: 20, + }, + }, + left: { '@type': "QualifiedIdentifier", + '@role': [Binary, Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 979, + line: 31, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 984, + line: 31, + col: 26, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 978, + line: 31, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 983, + line: 31, + col: 25, + }, + }, + Name: "state", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 978, + line: 31, + col: 20, + }, + }, + Name: "url_prefix", + }, + ], + }, + op: { '@type': "Add", + '@token': "+", + '@role': [Add, Arithmetic, Binary, Operator], + '@pos': { '@type': "uast:Positions", + }, + }, + right: { '@type': "uast:Identifier", + '@role': [Binary, Expression, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 997, + line: 31, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 1001, + line: 31, + col: 43, + }, + }, + Name: "path", + }, + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "QualifiedIdentifier", + '@role': [Condition, Expression, Identifier, If, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 942, + line: 30, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 947, + line: 30, + col: 18, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 941, + line: 30, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 946, + line: 30, + col: 17, + }, + }, + Name: "state", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 941, + line: 30, + col: 12, + }, + }, + Name: "url_prefix", + }, + ], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1010, + line: 32, + col: 9, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1010, + line: 32, + col: 9, + }, + }, + args: [ + { '@type': "BinOp", + '@role': [Argument, Binary, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1033, + line: 32, + col: 32, + }, + }, + left: { '@type': "uast:Identifier", + '@role': [Binary, Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1033, + line: 32, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 1037, + line: 32, + col: 36, + }, + }, + Name: "path", + }, + op: { '@type': "Add", + '@token': "+", + '@role': [Add, Arithmetic, Binary, Operator], + '@pos': { '@type': "uast:Positions", + }, + }, + right: { '@type': "uast:String", + '@role': [Binary, Expression, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1040, + line: 32, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 1058, + line: 32, + col: 57, + }, + }, + Format: "", + Value: "/", + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1011, + line: 32, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 1016, + line: 32, + col: 15, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1010, + line: 32, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1015, + line: 32, + col: 14, + }, + }, + Name: "state", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1016, + line: 32, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 1019, + line: 32, + col: 18, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1010, + line: 32, + col: 9, + }, + }, + Name: "add_url_rule", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "endpoint", + }, + value: { '@type': "BinOp", + '@role': [Argument, Binary, Expression, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1100, + line: 33, + col: 41, + }, + }, + left: { '@type': "uast:String", + '@role': [Binary, Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1100, + line: 33, + col: 41, + }, + end: { '@type': "uast:Position", + offset: 1111, + line: 33, + col: 52, + }, + }, + Format: "", + Value: "%s.static", + }, + op: { '@type': "Mod", + '@token': "%", + '@role': [Arithmetic, Binary, Module, Operator], + '@pos': { '@type': "uast:Positions", + }, + }, + right: { '@type': "QualifiedIdentifier", + '@role': [Binary, Expression, Identifier, Qualified, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1115, + line: 33, + col: 56, + }, + end: { '@type': "uast:Position", + offset: 1121, + line: 33, + col: 62, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1114, + line: 33, + col: 55, + }, + end: { '@type': "uast:Position", + offset: 1120, + line: 33, + col: 61, + }, + }, + Name: "module", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1114, + line: 33, + col: 55, + }, + }, + Name: "name", + }, + ], + }, + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "view_func", + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Argument, Expression, Identifier, Qualified, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1169, + line: 34, + col: 43, + }, + end: { '@type': "uast:Position", + offset: 1175, + line: 34, + col: 49, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1168, + line: 34, + col: 42, + }, + end: { '@type': "uast:Position", + offset: 1174, + line: 34, + col: 48, + }, + }, + Name: "module", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1168, + line: 34, + col: 42, + }, + }, + Name: "send_static_file", + }, + ], + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "subdomain", + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Argument, Expression, Identifier, Qualified, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1235, + line: 35, + col: 43, + }, + end: { '@type': "uast:Position", + offset: 1240, + line: 35, + col: 48, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1234, + line: 35, + col: 42, + }, + end: { '@type': "uast:Position", + offset: 1239, + line: 35, + col: 47, + }, + }, + Name: "state", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1234, + line: 35, + col: 42, + }, + }, + Name: "subdomain", + }, + ], + }, + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 585, + line: 21, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 590, + line: 21, + col: 24, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 585, + line: 21, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 590, + line: 21, + col: 24, + }, + }, + Name: "state", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1255, + line: 36, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1261, + line: 36, + col: 11, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1262, + line: 36, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 1271, + line: 36, + col: 21, + }, + }, + Name: "_register", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 310, + line: 15, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 316, + line: 15, + col: 28, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 310, + line: 15, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 316, + line: 15, + col: 28, + }, + }, + Name: "module", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 318, + line: 15, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 329, + line: 15, + col: 41, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 318, + line: 15, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 329, + line: 15, + col: 41, + }, + }, + Name: "static_path", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "ClassDef", + '@token': "_ModuleSetupState", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1280, + line: 39, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 1297, + line: 39, + col: 24, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1298, + line: 39, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 1304, + line: 39, + col: 31, + }, + }, + Name: "object", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1316, + line: 41, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1324, + line: 41, + col: 17, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "__init__", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1378, + line: 42, + col: 9, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1379, + line: 42, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 1383, + line: 42, + col: 14, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1378, + line: 42, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1382, + line: 42, + col: 13, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1378, + line: 42, + col: 9, + }, + }, + Name: "app", + }, + ], + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1383, + line: 42, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 1386, + line: 42, + col: 17, + }, + }, + Name: "app", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1401, + line: 43, + col: 9, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1402, + line: 43, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 1406, + line: 43, + col: 14, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1401, + line: 43, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1405, + line: 43, + col: 13, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1401, + line: 43, + col: 9, + }, + }, + Name: "url_prefix", + }, + ], + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1406, + line: 43, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 1416, + line: 43, + col: 24, + }, + }, + Name: "url_prefix", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1438, + line: 44, + col: 9, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1439, + line: 44, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 1443, + line: 44, + col: 14, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1438, + line: 44, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1442, + line: 44, + col: 13, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1438, + line: 44, + col: 9, + }, + }, + Name: "subdomain", + }, + ], + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1443, + line: 44, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 1452, + line: 44, + col: 23, + }, + }, + Name: "subdomain", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1325, + line: 41, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 1329, + line: 41, + col: 22, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1325, + line: 41, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 1329, + line: 41, + col: 22, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1331, + line: 41, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 1334, + line: 41, + col: 27, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1331, + line: 41, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 1334, + line: 41, + col: 27, + }, + }, + Name: "app", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1336, + line: 41, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 1346, + line: 41, + col: 39, + }, + }, + Init: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1347, + line: 41, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 1351, + line: 41, + col: 44, + }, + }, + LiteralValue: "None", + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1307, + line: 40, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1307, + line: 40, + col: 1, + }, + }, + lines: [], + }, + value: ~, + }, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1336, + line: 41, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 1346, + line: 41, + col: 39, + }, + }, + Name: "url_prefix", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1353, + line: 41, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 1362, + line: 41, + col: 55, + }, + }, + Init: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1363, + line: 41, + col: 56, + }, + end: { '@type': "uast:Position", + offset: 1367, + line: 41, + col: 60, + }, + }, + LiteralValue: "None", + value: ~, + }, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1353, + line: 41, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 1362, + line: 41, + col: 55, + }, + }, + Name: "subdomain", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "ClassDef", + '@token': "Module", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1473, + line: 47, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 1479, + line: 47, + col: 13, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1480, + line: 47, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 1499, + line: 47, + col: 33, + }, + }, + Name: "_PackageBoundObject", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4110, + line: 115, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1506, + line: 48, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 4117, + line: 115, + col: 8, + }, + }, + Format: "", + Value: "Container object that enables pluggable applications. A module can\n be used to organize larger applications. They represent blueprints that,\n in combination with a :class:`Flask` object are used to create a large\n application.\n\n A module is like an application bound to an `import_name`. Multiple\n modules can share the same import names, but in that case a `name` has\n to be provided to keep them apart. If different import names are used,\n the rightmost part of the import name is used as name.\n\n Here's an example structure for a larger application::\n\n /myapplication\n /__init__.py\n /views\n /__init__.py\n /admin.py\n /frontend.py\n\n The `myapplication/__init__.py` can look like this::\n\n from flask import Flask\n from myapplication.views.admin import admin\n from myapplication.views.frontend import frontend\n\n app = Flask(__name__)\n app.register_module(admin, url_prefix='/admin')\n app.register_module(frontend)\n\n And here's an example view module (`myapplication/views/admin.py`)::\n\n from flask import Module\n\n admin = Module(__name__)\n\n @admin.route('/')\n def index():\n pass\n\n @admin.route('/login')\n def login():\n pass\n\n For a gentle introduction into modules, checkout the\n :ref:`working-with-modules` section.\n\n .. versionadded:: 0.5\n The `static_path` parameter was added and it's now possible for\n modules to refer to their own templates and static files. See\n :ref:`modules-and-resources` for more information.\n\n .. versionadded:: 0.6\n The `subdomain` parameter was added.\n\n :param import_name: the name of the Python package or module\n implementing this :class:`Module`.\n :param name: the internal short name for the module. Unless specified\n the rightmost part of the import name\n :param url_prefix: an optional string that is used to prefix all the\n URL rules of this module. This can also be specified\n when registering the module with the application.\n :param subdomain: used to set the subdomain setting for URL rules that\n do not have a subdomain setting set.\n :param static_path: can be used to specify a different path for the\n static files on the web. Defaults to ``/static``.\n This does not affect the folder the files are served\n *from*.\n ", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4127, + line: 117, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 4135, + line: 117, + col: 17, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "__init__", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4243, + line: 119, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 4245, + line: 119, + col: 11, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4272, + line: 120, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 4278, + line: 120, + col: 19, + }, + }, + msg: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4299, + line: 120, + col: 40, + }, + }, + Format: "", + Value: "name required if package name does not point to a submodule", + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4279, + line: 120, + col: 20, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4286, + line: 120, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 4297, + line: 120, + col: 38, + }, + }, + Name: "import_name", + }, + ], + }, + left: { '@type': "uast:String", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4279, + line: 120, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 4282, + line: 120, + col: 23, + }, + }, + Format: "", + Value: ".", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "In", + '@token': "in", + '@role': [Contains, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4394, + line: 122, + col: 13, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4394, + line: 122, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 4398, + line: 122, + col: 17, + }, + }, + Name: "name", + }, + ], + value: { '@type': "Subscript", + '@role': [Expression, Incomplete, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4401, + line: 122, + col: 20, + }, + }, + ctx: "Load", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "Num", + '@token': 1, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4428, + line: 122, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 4429, + line: 122, + col: 48, + }, + }, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4401, + line: 122, + col: 20, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4412, + line: 122, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 4413, + line: 122, + col: 32, + }, + }, + Format: "", + Value: ".", + }, + { '@type': "Num", + '@token': 1, + '@role': [Argument, Call, Expression, Function, Literal, Name, Number, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4425, + line: 122, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 4426, + line: 122, + col: 45, + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4402, + line: 122, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 4413, + line: 122, + col: 32, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4401, + line: 122, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 4412, + line: 122, + col: 31, + }, + }, + Name: "import_name", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4401, + line: 122, + col: 20, + }, + }, + Name: "rsplit", + }, + ], + }, + keywords: [], + }, + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4246, + line: 119, + col: 12, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4254, + line: 119, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 4258, + line: 119, + col: 24, + }, + }, + LiteralValue: "None", + value: ~, + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4246, + line: 119, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 4250, + line: 119, + col: 16, + }, + }, + Name: "name", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Is", + '@token': "is", + '@role': [Identical, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4439, + line: 123, + col: 9, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4439, + line: 123, + col: 9, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4468, + line: 123, + col: 38, + }, + end: { '@type': "uast:Position", + offset: 4472, + line: 123, + col: 42, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4474, + line: 123, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 4485, + line: 123, + col: 55, + }, + }, + Name: "import_name", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4440, + line: 123, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 4459, + line: 123, + col: 29, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4439, + line: 123, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 4458, + line: 123, + col: 28, + }, + }, + Name: "_PackageBoundObject", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4439, + line: 123, + col: 9, + }, + }, + Name: "__init__", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4495, + line: 124, + col: 9, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4496, + line: 124, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 4500, + line: 124, + col: 14, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4495, + line: 124, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 4499, + line: 124, + col: 13, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4495, + line: 124, + col: 9, + }, + }, + Name: "name", + }, + ], + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4500, + line: 124, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 4504, + line: 124, + col: 18, + }, + }, + Name: "name", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4520, + line: 125, + col: 9, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4521, + line: 125, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 4525, + line: 125, + col: 14, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4520, + line: 125, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 4524, + line: 125, + col: 13, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4520, + line: 125, + col: 9, + }, + }, + Name: "url_prefix", + }, + ], + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4525, + line: 125, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 4535, + line: 125, + col: 24, + }, + }, + Name: "url_prefix", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4557, + line: 126, + col: 9, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4558, + line: 126, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 4562, + line: 126, + col: 14, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4557, + line: 126, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 4561, + line: 126, + col: 13, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4557, + line: 126, + col: 9, + }, + }, + Name: "subdomain", + }, + ], + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4562, + line: 126, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 4571, + line: 126, + col: 23, + }, + }, + Name: "subdomain", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4592, + line: 127, + col: 9, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4593, + line: 127, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 4597, + line: 127, + col: 14, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4592, + line: 127, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 4596, + line: 127, + col: 13, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4592, + line: 127, + col: 9, + }, + }, + Name: "view_functions", + }, + ], + }, + ], + value: { '@type': "Dict", + '@role': [Expression, Literal, Map, Primitive, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4614, + line: 127, + col: 31, + }, + }, + keys: [], + values: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4625, + line: 128, + col: 9, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4626, + line: 128, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 4630, + line: 128, + col: 14, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4625, + line: 128, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 4629, + line: 128, + col: 13, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4625, + line: 128, + col: 9, + }, + }, + Name: "_register_events", + }, + ], + }, + ], + value: { '@type': "List", + '@role': [Expression, List, Literal, Primitive, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4649, + line: 128, + col: 33, + }, + }, + ctx: "Load", + elts: [ + { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4650, + line: 128, + col: 34, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4667, + line: 128, + col: 51, + }, + end: { '@type': "uast:Position", + offset: 4671, + line: 128, + col: 55, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4673, + line: 128, + col: 57, + }, + end: { '@type': "uast:Position", + offset: 4684, + line: 128, + col: 68, + }, + }, + Name: "static_path", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4650, + line: 128, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 4666, + line: 128, + col: 50, + }, + }, + Name: "_register_module", + }, + keywords: [], + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4136, + line: 117, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 4140, + line: 117, + col: 22, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4136, + line: 117, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 4140, + line: 117, + col: 22, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4142, + line: 117, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 4153, + line: 117, + col: 35, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4142, + line: 117, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 4153, + line: 117, + col: 35, + }, + }, + Name: "import_name", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4155, + line: 117, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 4159, + line: 117, + col: 41, + }, + }, + Init: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4160, + line: 117, + col: 42, + }, + end: { '@type': "uast:Position", + offset: 4164, + line: 117, + col: 46, + }, + }, + LiteralValue: "None", + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4118, + line: 116, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 4118, + line: 116, + col: 1, + }, + }, + lines: [], + }, + value: ~, + }, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4155, + line: 117, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 4159, + line: 117, + col: 41, + }, + }, + Name: "name", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4166, + line: 117, + col: 48, + }, + end: { '@type': "uast:Position", + offset: 4176, + line: 117, + col: 58, + }, + }, + Init: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4177, + line: 117, + col: 59, + }, + end: { '@type': "uast:Position", + offset: 4181, + line: 117, + col: 63, + }, + }, + LiteralValue: "None", + value: ~, + }, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4166, + line: 117, + col: 48, + }, + end: { '@type': "uast:Position", + offset: 4176, + line: 117, + col: 58, + }, + }, + Name: "url_prefix", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4200, + line: 118, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 4211, + line: 118, + col: 29, + }, + }, + Init: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4212, + line: 118, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 4216, + line: 118, + col: 34, + }, + }, + LiteralValue: "None", + value: ~, + }, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4200, + line: 118, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 4211, + line: 118, + col: 29, + }, + }, + Name: "static_path", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4218, + line: 118, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 4227, + line: 118, + col: 45, + }, + }, + Init: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4228, + line: 118, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 4232, + line: 118, + col: 50, + }, + }, + LiteralValue: "None", + value: ~, + }, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4218, + line: 118, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 4227, + line: 118, + col: 45, + }, + }, + Name: "subdomain", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4696, + line: 130, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 4701, + line: 130, + col: 14, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "route", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4876, + line: 133, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4734, + line: 131, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 4887, + line: 133, + col: 12, + }, + }, + Format: "", + Value: "Like :meth:`Flask.route` but for a module. The endpoint for the\n :func:`url_for` function is prefixed with the name of the module.\n ", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4900, + line: 134, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 4909, + line: 134, + col: 22, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "decorator", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4926, + line: 135, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4926, + line: 135, + col: 13, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4944, + line: 135, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 4948, + line: 135, + col: 35, + }, + }, + Name: "rule", + }, + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4951, + line: 135, + col: 38, + }, + end: { '@type': "uast:Position", + offset: 4952, + line: 135, + col: 39, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4950, + line: 135, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 4951, + line: 135, + col: 38, + }, + }, + Name: "f", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4950, + line: 135, + col: 37, + }, + }, + Name: "__name__", + }, + ], + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4962, + line: 135, + col: 49, + }, + end: { '@type': "uast:Position", + offset: 4963, + line: 135, + col: 50, + }, + }, + Name: "f", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4927, + line: 135, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 4931, + line: 135, + col: 18, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4926, + line: 135, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 4930, + line: 135, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4926, + line: 135, + col: 13, + }, + }, + Name: "add_url_rule", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: ~, + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4967, + line: 135, + col: 54, + }, + end: { '@type': "uast:Position", + offset: 4974, + line: 135, + col: 61, + }, + }, + Name: "options", + }, + }, + ], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4988, + line: 136, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 4994, + line: 136, + col: 19, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4995, + line: 136, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 4996, + line: 136, + col: 21, + }, + }, + Name: "f", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4910, + line: 134, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 4911, + line: 134, + col: 24, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4910, + line: 134, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 4911, + line: 134, + col: 24, + }, + }, + Name: "f", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5005, + line: 137, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 5011, + line: 137, + col: 15, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5012, + line: 137, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 5021, + line: 137, + col: 25, + }, + }, + Name: "decorator", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4702, + line: 130, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 4706, + line: 130, + col: 19, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4702, + line: 130, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 4706, + line: 130, + col: 19, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4708, + line: 130, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 4712, + line: 130, + col: 25, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4708, + line: 130, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 4712, + line: 130, + col: 25, + }, + }, + Name: "rule", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4716, + line: 130, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 4723, + line: 130, + col: 36, + }, + }, + Init: ~, + MapVariadic: true, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4716, + line: 130, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 4723, + line: 130, + col: 36, + }, + }, + Name: "options", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5031, + line: 139, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 5043, + line: 139, + col: 21, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "add_url_rule", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5476, + line: 147, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5107, + line: 140, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 5487, + line: 147, + col: 12, + }, + }, + Format: "", + Value: "Like :meth:`Flask.add_url_rule` but for a module. The endpoint for\n the :func:`url_for` function is prefixed with the name of the module.\n\n .. versionchanged:: 0.6\n The `endpoint` argument is now optional and will default to the\n function name to consistent with the function of the same name\n on the application object.\n ", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5500, + line: 148, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 5513, + line: 148, + col: 26, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "register_rule", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5534, + line: 149, + col: 13, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5534, + line: 149, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 5542, + line: 149, + col: 21, + }, + }, + Name: "the_rule", + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5545, + line: 149, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 5549, + line: 149, + col: 28, + }, + }, + Name: "rule", + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5562, + line: 150, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 5564, + line: 150, + col: 15, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5599, + line: 151, + col: 17, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5599, + line: 151, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 5607, + line: 151, + col: 25, + }, + }, + Name: "the_rule", + }, + ], + value: { '@type': "BinOp", + '@role': [Binary, Expression, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5610, + line: 151, + col: 28, + }, + }, + left: { '@type': "QualifiedIdentifier", + '@role': [Binary, Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5611, + line: 151, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 5616, + line: 151, + col: 34, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5610, + line: 151, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 5615, + line: 151, + col: 33, + }, + }, + Name: "state", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5610, + line: 151, + col: 28, + }, + }, + Name: "url_prefix", + }, + ], + }, + op: { '@type': "Add", + '@token': "+", + '@role': [Add, Arithmetic, Binary, Operator], + '@pos': { '@type': "uast:Positions", + }, + }, + right: { '@type': "uast:Identifier", + '@role': [Binary, Expression, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5629, + line: 151, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 5633, + line: 151, + col: 51, + }, + }, + Name: "rule", + }, + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "QualifiedIdentifier", + '@role': [Condition, Expression, Identifier, If, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5566, + line: 150, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 5571, + line: 150, + col: 22, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5565, + line: 150, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 5570, + line: 150, + col: 21, + }, + }, + Name: "state", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5565, + line: 150, + col: 16, + }, + }, + Name: "url_prefix", + }, + ], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5646, + line: 152, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5646, + line: 152, + col: 13, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5665, + line: 152, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 5676, + line: 152, + col: 43, + }, + }, + Format: "", + Value: "subdomain", + }, + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5679, + line: 152, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 5684, + line: 152, + col: 51, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5678, + line: 152, + col: 45, + }, + end: { '@type': "uast:Position", + offset: 5683, + line: 152, + col: 50, + }, + }, + Name: "state", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5678, + line: 152, + col: 45, + }, + }, + Name: "subdomain", + }, + ], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5647, + line: 152, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 5654, + line: 152, + col: 21, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5646, + line: 152, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 5653, + line: 152, + col: 20, + }, + }, + Name: "options", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5646, + line: 152, + col: 13, + }, + }, + Name: "setdefault", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5707, + line: 153, + col: 13, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5707, + line: 153, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 5719, + line: 153, + col: 25, + }, + }, + Name: "the_endpoint", + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5722, + line: 153, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 5730, + line: 153, + col: 36, + }, + }, + Name: "endpoint", + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5743, + line: 154, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 5745, + line: 154, + col: 15, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5784, + line: 155, + col: 17, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5784, + line: 155, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 5796, + line: 155, + col: 29, + }, + }, + Name: "the_endpoint", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5799, + line: 155, + col: 32, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5824, + line: 155, + col: 57, + }, + end: { '@type': "uast:Position", + offset: 5833, + line: 155, + col: 66, + }, + }, + Name: "view_func", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5799, + line: 155, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 5823, + line: 155, + col: 56, + }, + }, + Name: "_endpoint_from_view_func", + }, + keywords: [], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5746, + line: 154, + col: 16, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5762, + line: 154, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 5766, + line: 154, + col: 36, + }, + }, + LiteralValue: "None", + value: ~, + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5746, + line: 154, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 5758, + line: 154, + col: 28, + }, + }, + Name: "the_endpoint", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Is", + '@token': "is", + '@role': [Identical, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5847, + line: 156, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5847, + line: 156, + col: 13, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5870, + line: 156, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 5878, + line: 156, + col: 44, + }, + }, + Name: "the_rule", + }, + { '@type': "BinOp", + '@role': [Argument, Binary, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5880, + line: 156, + col: 46, + }, + }, + left: { '@type': "uast:String", + '@role': [Binary, Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5880, + line: 156, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 5887, + line: 156, + col: 53, + }, + }, + Format: "", + Value: "%s.%s", + }, + op: { '@type': "Mod", + '@token': "%", + '@role': [Arithmetic, Binary, Module, Operator], + '@pos': { '@type': "uast:Positions", + }, + }, + right: { '@type': "Tuple", + '@role': [Binary, Expression, Literal, Primitive, Right, Tuple], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5891, + line: 156, + col: 57, + }, + }, + ctx: "Load", + elts: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5892, + line: 156, + col: 58, + }, + end: { '@type': "uast:Position", + offset: 5896, + line: 156, + col: 62, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5891, + line: 156, + col: 57, + }, + end: { '@type': "uast:Position", + offset: 5895, + line: 156, + col: 61, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5891, + line: 156, + col: 57, + }, + }, + Name: "name", + }, + ], + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5958, + line: 157, + col: 57, + }, + end: { '@type': "uast:Position", + offset: 5970, + line: 157, + col: 69, + }, + }, + Name: "the_endpoint", + }, + ], + }, + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6008, + line: 158, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 6017, + line: 158, + col: 45, + }, + }, + Name: "view_func", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5848, + line: 156, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 5853, + line: 156, + col: 19, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5847, + line: 156, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 5852, + line: 156, + col: 18, + }, + }, + Name: "state", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5853, + line: 156, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 5856, + line: 156, + col: 22, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5847, + line: 156, + col: 13, + }, + }, + Name: "add_url_rule", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: ~, + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6021, + line: 158, + col: 49, + }, + end: { '@type': "uast:Position", + offset: 6028, + line: 158, + col: 56, + }, + }, + Name: "options", + }, + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5514, + line: 148, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 5519, + line: 148, + col: 32, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5514, + line: 148, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 5519, + line: 148, + col: 32, + }, + }, + Name: "state", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6038, + line: 159, + col: 9, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6038, + line: 159, + col: 9, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6051, + line: 159, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 6064, + line: 159, + col: 35, + }, + }, + Name: "register_rule", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6039, + line: 159, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 6043, + line: 159, + col: 14, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6038, + line: 159, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 6042, + line: 159, + col: 13, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6038, + line: 159, + col: 9, + }, + }, + Name: "_record", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5044, + line: 139, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 5048, + line: 139, + col: 26, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5044, + line: 139, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 5048, + line: 139, + col: 26, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5050, + line: 139, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 5054, + line: 139, + col: 32, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5050, + line: 139, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 5054, + line: 139, + col: 32, + }, + }, + Name: "rule", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5056, + line: 139, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 5064, + line: 139, + col: 42, + }, + }, + Init: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5065, + line: 139, + col: 43, + }, + end: { '@type': "uast:Position", + offset: 5069, + line: 139, + col: 47, + }, + }, + LiteralValue: "None", + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5022, + line: 138, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 5022, + line: 138, + col: 1, + }, + }, + lines: [], + }, + value: ~, + }, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5056, + line: 139, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 5064, + line: 139, + col: 42, + }, + }, + Name: "endpoint", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5071, + line: 139, + col: 49, + }, + end: { '@type': "uast:Position", + offset: 5080, + line: 139, + col: 58, + }, + }, + Init: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5081, + line: 139, + col: 59, + }, + end: { '@type': "uast:Position", + offset: 5085, + line: 139, + col: 63, + }, + }, + LiteralValue: "None", + value: ~, + }, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5071, + line: 139, + col: 49, + }, + end: { '@type': "uast:Position", + offset: 5080, + line: 139, + col: 58, + }, + }, + Name: "view_func", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5089, + line: 139, + col: 67, + }, + end: { '@type': "uast:Position", + offset: 5096, + line: 139, + col: 74, + }, + }, + Init: ~, + MapVariadic: true, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 5089, + line: 139, + col: 67, + }, + end: { '@type': "uast:Position", + offset: 5096, + line: 139, + col: 74, + }, + }, + Name: "options", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6090, + line: 161, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 6098, + line: 161, + col: 32, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "endpoint", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6109, + line: 162, + col: 9, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6109, + line: 162, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 6160, + line: 162, + col: 60, + }, + }, + Format: "", + Value: "Like :meth:`Flask.endpoint` but for a module.", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6173, + line: 163, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 6182, + line: 163, + col: 22, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "decorator", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6199, + line: 164, + col: 13, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6199, + line: 164, + col: 13, + }, + }, + ctx: "Store", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6219, + line: 164, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 6227, + line: 164, + col: 41, + }, + }, + Name: "endpoint", + }, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6200, + line: 164, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 6204, + line: 164, + col: 18, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6199, + line: 164, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 6203, + line: 164, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6199, + line: 164, + col: 13, + }, + }, + Name: "view_functions", + }, + ], + }, + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6231, + line: 164, + col: 45, + }, + end: { '@type': "uast:Position", + offset: 6232, + line: 164, + col: 46, + }, + }, + Name: "f", + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6245, + line: 165, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 6251, + line: 165, + col: 19, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6252, + line: 165, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 6253, + line: 165, + col: 21, + }, + }, + Name: "f", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6183, + line: 163, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 6184, + line: 163, + col: 24, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6183, + line: 163, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 6184, + line: 163, + col: 24, + }, + }, + Name: "f", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6262, + line: 166, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 6268, + line: 166, + col: 15, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6269, + line: 166, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 6278, + line: 166, + col: 25, + }, + }, + Name: "decorator", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6084, + line: 161, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 6088, + line: 161, + col: 22, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6084, + line: 161, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 6088, + line: 161, + col: 22, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6075, + line: 161, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 6083, + line: 161, + col: 17, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6075, + line: 161, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 6083, + line: 161, + col: 17, + }, + }, + Name: "endpoint", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6288, + line: 168, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 6302, + line: 168, + col: 23, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "before_request", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6490, + line: 172, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6321, + line: 169, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 6501, + line: 172, + col: 12, + }, + }, + Format: "", + Value: "Like :meth:`Flask.before_request` but for a module. This function\n is only executed before each request that is handled by a function of\n that module.\n ", + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6510, + line: 173, + col: 9, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6510, + line: 173, + col: 9, + }, + }, + args: [ + { '@type': "Lambda", + '@role': [Anonymous, Argument, Call, Declaration, Function, Name, Positional, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6523, + line: 173, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 6529, + line: 173, + col: 28, + }, + }, + args: { '@type': "arguments", + '@role': [Argument, Declaration, Function, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + args: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6530, + line: 173, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 6531, + line: 173, + col: 30, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6530, + line: 173, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 6531, + line: 173, + col: 30, + }, + }, + Name: "s", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + }, + body: { '@type': "FunctionDef.body", + '@role': [Body, Declaration, Function], + 'body_stmts': { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6533, + line: 173, + col: 32, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6606, + line: 174, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 6607, + line: 174, + col: 48, + }, + }, + Name: "f", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6534, + line: 173, + col: 33, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6533, + line: 173, + col: 32, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6585, + line: 174, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 6589, + line: 174, + col: 30, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6584, + line: 174, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 6588, + line: 174, + col: 29, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6584, + line: 174, + col: 25, + }, + }, + Name: "name", + }, + ], + }, + { '@type': "List", + '@role': [Argument, Call, Expression, Function, List, Literal, Name, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6595, + line: 174, + col: 36, + }, + }, + ctx: "Load", + elts: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6534, + line: 173, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 6535, + line: 173, + col: 34, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6533, + line: 173, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 6534, + line: 173, + col: 33, + }, + }, + Name: "s", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6535, + line: 173, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 6538, + line: 173, + col: 37, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6539, + line: 173, + col: 38, + }, + end: { '@type': "uast:Position", + offset: 6559, + line: 173, + col: 58, + }, + }, + Name: "before_request_funcs", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6533, + line: 173, + col: 32, + }, + }, + Name: "setdefault", + }, + ], + }, + keywords: [], + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6533, + line: 173, + col: 32, + }, + }, + Name: "append", + }, + ], + }, + keywords: [], + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6511, + line: 173, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 6515, + line: 173, + col: 14, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6510, + line: 173, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 6514, + line: 173, + col: 13, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6510, + line: 173, + col: 9, + }, + }, + Name: "_record", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6618, + line: 175, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 6624, + line: 175, + col: 15, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6625, + line: 175, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 6626, + line: 175, + col: 17, + }, + }, + Name: "f", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6303, + line: 168, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 6307, + line: 168, + col: 28, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6303, + line: 168, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 6307, + line: 168, + col: 28, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6309, + line: 168, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 6310, + line: 168, + col: 31, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6309, + line: 168, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 6310, + line: 168, + col: 31, + }, + }, + Name: "f", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6636, + line: 177, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 6654, + line: 177, + col: 27, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "before_app_request", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6798, + line: 180, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6673, + line: 178, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 6809, + line: 180, + col: 12, + }, + }, + Format: "", + Value: "Like :meth:`Flask.before_request`. Such a function is executed\n before each request, even if outside of a module.\n ", + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6818, + line: 181, + col: 9, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6818, + line: 181, + col: 9, + }, + }, + args: [ + { '@type': "Lambda", + '@role': [Anonymous, Argument, Call, Declaration, Function, Name, Positional, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6831, + line: 181, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 6837, + line: 181, + col: 28, + }, + }, + args: { '@type': "arguments", + '@role': [Argument, Declaration, Function, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + args: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6838, + line: 181, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 6839, + line: 181, + col: 30, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6838, + line: 181, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 6839, + line: 181, + col: 30, + }, + }, + Name: "s", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + }, + body: { '@type': "FunctionDef.body", + '@role': [Body, Declaration, Function], + 'body_stmts': { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6841, + line: 181, + col: 32, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6909, + line: 182, + col: 42, + }, + end: { '@type': "uast:Position", + offset: 6910, + line: 182, + col: 43, + }, + }, + Name: "f", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6842, + line: 181, + col: 33, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6841, + line: 181, + col: 32, + }, + }, + args: [ + { '@type': "NoneLiteral", + '@token': "None", + '@role': [Argument, Call, Expression, Function, Literal, Name, 'Null', Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6892, + line: 182, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 6896, + line: 182, + col: 29, + }, + }, + LiteralValue: "None", + value: ~, + }, + { '@type': "List", + '@role': [Argument, Call, Expression, Function, List, Literal, Name, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6898, + line: 182, + col: 31, + }, + }, + ctx: "Load", + elts: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6842, + line: 181, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 6843, + line: 181, + col: 34, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6841, + line: 181, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 6842, + line: 181, + col: 33, + }, + }, + Name: "s", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6843, + line: 181, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 6846, + line: 181, + col: 37, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6847, + line: 181, + col: 38, + }, + end: { '@type': "uast:Position", + offset: 6867, + line: 181, + col: 58, + }, + }, + Name: "before_request_funcs", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6841, + line: 181, + col: 32, + }, + }, + Name: "setdefault", + }, + ], + }, + keywords: [], + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6841, + line: 181, + col: 32, + }, + }, + Name: "append", + }, + ], + }, + keywords: [], + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6819, + line: 181, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 6823, + line: 181, + col: 14, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6818, + line: 181, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 6822, + line: 181, + col: 13, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6818, + line: 181, + col: 9, + }, + }, + Name: "_record", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6921, + line: 183, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 6927, + line: 183, + col: 15, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6928, + line: 183, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 6929, + line: 183, + col: 17, + }, + }, + Name: "f", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6655, + line: 177, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 6659, + line: 177, + col: 32, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6655, + line: 177, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 6659, + line: 177, + col: 32, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6661, + line: 177, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 6662, + line: 177, + col: 35, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6661, + line: 177, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 6662, + line: 177, + col: 35, + }, + }, + Name: "f", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6939, + line: 185, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 6952, + line: 185, + col: 22, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "after_request", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7138, + line: 189, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6971, + line: 186, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 7149, + line: 189, + col: 12, + }, + }, + Format: "", + Value: "Like :meth:`Flask.after_request` but for a module. This function\n is only executed after each request that is handled by a function of\n that module.\n ", + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7158, + line: 190, + col: 9, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7158, + line: 190, + col: 9, + }, + }, + args: [ + { '@type': "Lambda", + '@role': [Anonymous, Argument, Call, Declaration, Function, Name, Positional, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7171, + line: 190, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 7177, + line: 190, + col: 28, + }, + }, + args: { '@type': "arguments", + '@role': [Argument, Declaration, Function, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + args: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7178, + line: 190, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 7179, + line: 190, + col: 30, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7178, + line: 190, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 7179, + line: 190, + col: 30, + }, + }, + Name: "s", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + }, + body: { '@type': "FunctionDef.body", + '@role': [Body, Declaration, Function], + 'body_stmts': { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7181, + line: 190, + col: 32, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7253, + line: 191, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 7254, + line: 191, + col: 48, + }, + }, + Name: "f", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7182, + line: 190, + col: 33, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7181, + line: 190, + col: 32, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7232, + line: 191, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 7236, + line: 191, + col: 30, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7231, + line: 191, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 7235, + line: 191, + col: 29, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7231, + line: 191, + col: 25, + }, + }, + Name: "name", + }, + ], + }, + { '@type': "List", + '@role': [Argument, Call, Expression, Function, List, Literal, Name, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7242, + line: 191, + col: 36, + }, + }, + ctx: "Load", + elts: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7182, + line: 190, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 7183, + line: 190, + col: 34, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7181, + line: 190, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 7182, + line: 190, + col: 33, + }, + }, + Name: "s", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7183, + line: 190, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 7186, + line: 190, + col: 37, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7187, + line: 190, + col: 38, + }, + end: { '@type': "uast:Position", + offset: 7206, + line: 190, + col: 57, + }, + }, + Name: "after_request_funcs", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7181, + line: 190, + col: 32, + }, + }, + Name: "setdefault", + }, + ], + }, + keywords: [], + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7181, + line: 190, + col: 32, + }, + }, + Name: "append", + }, + ], + }, + keywords: [], + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7159, + line: 190, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 7163, + line: 190, + col: 14, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7158, + line: 190, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 7162, + line: 190, + col: 13, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7158, + line: 190, + col: 9, + }, + }, + Name: "_record", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7265, + line: 192, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 7271, + line: 192, + col: 15, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7272, + line: 192, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 7273, + line: 192, + col: 17, + }, + }, + Name: "f", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6953, + line: 185, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 6957, + line: 185, + col: 27, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6953, + line: 185, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 6957, + line: 185, + col: 27, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6959, + line: 185, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 6960, + line: 185, + col: 30, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 6959, + line: 185, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 6960, + line: 185, + col: 30, + }, + }, + Name: "f", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7283, + line: 194, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 7300, + line: 194, + col: 26, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "after_app_request", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7461, + line: 197, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7319, + line: 195, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 7472, + line: 197, + col: 12, + }, + }, + Format: "", + Value: "Like :meth:`Flask.after_request` but for a module. Such a function\n is executed after each request, even if outside of the module.\n ", + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7481, + line: 198, + col: 9, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7481, + line: 198, + col: 9, + }, + }, + args: [ + { '@type': "Lambda", + '@role': [Anonymous, Argument, Call, Declaration, Function, Name, Positional, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7494, + line: 198, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 7500, + line: 198, + col: 28, + }, + }, + args: { '@type': "arguments", + '@role': [Argument, Declaration, Function, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + args: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7501, + line: 198, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 7502, + line: 198, + col: 30, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7501, + line: 198, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 7502, + line: 198, + col: 30, + }, + }, + Name: "s", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + }, + body: { '@type': "FunctionDef.body", + '@role': [Body, Declaration, Function], + 'body_stmts': { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7504, + line: 198, + col: 32, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7571, + line: 199, + col: 42, + }, + end: { '@type': "uast:Position", + offset: 7572, + line: 199, + col: 43, + }, + }, + Name: "f", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7505, + line: 198, + col: 33, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7504, + line: 198, + col: 32, + }, + }, + args: [ + { '@type': "NoneLiteral", + '@token': "None", + '@role': [Argument, Call, Expression, Function, Literal, Name, 'Null', Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7554, + line: 199, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 7558, + line: 199, + col: 29, + }, + }, + LiteralValue: "None", + value: ~, + }, + { '@type': "List", + '@role': [Argument, Call, Expression, Function, List, Literal, Name, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7560, + line: 199, + col: 31, + }, + }, + ctx: "Load", + elts: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7505, + line: 198, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 7506, + line: 198, + col: 34, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7504, + line: 198, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 7505, + line: 198, + col: 33, + }, + }, + Name: "s", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7506, + line: 198, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 7509, + line: 198, + col: 37, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7510, + line: 198, + col: 38, + }, + end: { '@type': "uast:Position", + offset: 7529, + line: 198, + col: 57, + }, + }, + Name: "after_request_funcs", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7504, + line: 198, + col: 32, + }, + }, + Name: "setdefault", + }, + ], + }, + keywords: [], + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7504, + line: 198, + col: 32, + }, + }, + Name: "append", + }, + ], + }, + keywords: [], + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7482, + line: 198, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 7486, + line: 198, + col: 14, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7481, + line: 198, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 7485, + line: 198, + col: 13, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7481, + line: 198, + col: 9, + }, + }, + Name: "_record", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7583, + line: 200, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 7589, + line: 200, + col: 15, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7590, + line: 200, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 7591, + line: 200, + col: 17, + }, + }, + Name: "f", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7301, + line: 194, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 7305, + line: 194, + col: 31, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7301, + line: 194, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 7305, + line: 194, + col: 31, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7307, + line: 194, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 7308, + line: 194, + col: 34, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7307, + line: 194, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 7308, + line: 194, + col: 34, + }, + }, + Name: "f", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7601, + line: 202, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 7618, + line: 202, + col: 26, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "context_processor", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7769, + line: 205, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7637, + line: 203, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 7780, + line: 205, + col: 12, + }, + }, + Format: "", + Value: "Like :meth:`Flask.context_processor` but for a module. This\n function is only executed for requests handled by a module.\n ", + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7789, + line: 206, + col: 9, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7789, + line: 206, + col: 9, + }, + }, + args: [ + { '@type': "Lambda", + '@role': [Anonymous, Argument, Call, Declaration, Function, Name, Positional, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7802, + line: 206, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 7808, + line: 206, + col: 28, + }, + }, + args: { '@type': "arguments", + '@role': [Argument, Declaration, Function, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + args: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7809, + line: 206, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 7810, + line: 206, + col: 30, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7809, + line: 206, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 7810, + line: 206, + col: 30, + }, + }, + Name: "s", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + }, + body: { '@type': "FunctionDef.body", + '@role': [Body, Declaration, Function], + 'body_stmts': { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7812, + line: 206, + col: 32, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7892, + line: 207, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 7893, + line: 207, + col: 48, + }, + }, + Name: "f", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7813, + line: 206, + col: 33, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7812, + line: 206, + col: 32, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7871, + line: 207, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 7875, + line: 207, + col: 30, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7870, + line: 207, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 7874, + line: 207, + col: 29, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7870, + line: 207, + col: 25, + }, + }, + Name: "name", + }, + ], + }, + { '@type': "List", + '@role': [Argument, Call, Expression, Function, List, Literal, Name, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7881, + line: 207, + col: 36, + }, + }, + ctx: "Load", + elts: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7813, + line: 206, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 7814, + line: 206, + col: 34, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7812, + line: 206, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 7813, + line: 206, + col: 33, + }, + }, + Name: "s", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7814, + line: 206, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 7817, + line: 206, + col: 37, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7818, + line: 206, + col: 38, + }, + end: { '@type': "uast:Position", + offset: 7845, + line: 206, + col: 65, + }, + }, + Name: "template_context_processors", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7812, + line: 206, + col: 32, + }, + }, + Name: "setdefault", + }, + ], + }, + keywords: [], + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7812, + line: 206, + col: 32, + }, + }, + Name: "append", + }, + ], + }, + keywords: [], + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7790, + line: 206, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 7794, + line: 206, + col: 14, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7789, + line: 206, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 7793, + line: 206, + col: 13, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7789, + line: 206, + col: 9, + }, + }, + Name: "_record", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7904, + line: 208, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 7910, + line: 208, + col: 15, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7911, + line: 208, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 7912, + line: 208, + col: 17, + }, + }, + Name: "f", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7619, + line: 202, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 7623, + line: 202, + col: 31, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7619, + line: 202, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 7623, + line: 202, + col: 31, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7625, + line: 202, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 7626, + line: 202, + col: 34, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7625, + line: 202, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 7626, + line: 202, + col: 34, + }, + }, + Name: "f", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7922, + line: 210, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 7943, + line: 210, + col: 30, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "app_context_processor", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8102, + line: 213, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7962, + line: 211, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 8113, + line: 213, + col: 12, + }, + }, + Format: "", + Value: "Like :meth:`Flask.context_processor` but for a module. Such a\n function is executed each request, even if outside of the module.\n ", + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8122, + line: 214, + col: 9, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8122, + line: 214, + col: 9, + }, + }, + args: [ + { '@type': "Lambda", + '@role': [Anonymous, Argument, Call, Declaration, Function, Name, Positional, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8135, + line: 214, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 8141, + line: 214, + col: 28, + }, + }, + args: { '@type': "arguments", + '@role': [Argument, Declaration, Function, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + args: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8142, + line: 214, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 8143, + line: 214, + col: 30, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8142, + line: 214, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 8143, + line: 214, + col: 30, + }, + }, + Name: "s", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + }, + body: { '@type': "FunctionDef.body", + '@role': [Body, Declaration, Function], + 'body_stmts': { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8145, + line: 214, + col: 32, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8220, + line: 215, + col: 42, + }, + end: { '@type': "uast:Position", + offset: 8221, + line: 215, + col: 43, + }, + }, + Name: "f", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8146, + line: 214, + col: 33, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8145, + line: 214, + col: 32, + }, + }, + args: [ + { '@type': "NoneLiteral", + '@token': "None", + '@role': [Argument, Call, Expression, Function, Literal, Name, 'Null', Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8203, + line: 215, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 8207, + line: 215, + col: 29, + }, + }, + LiteralValue: "None", + value: ~, + }, + { '@type': "List", + '@role': [Argument, Call, Expression, Function, List, Literal, Name, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8209, + line: 215, + col: 31, + }, + }, + ctx: "Load", + elts: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8146, + line: 214, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 8147, + line: 214, + col: 34, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8145, + line: 214, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 8146, + line: 214, + col: 33, + }, + }, + Name: "s", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8147, + line: 214, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 8150, + line: 214, + col: 37, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8151, + line: 214, + col: 38, + }, + end: { '@type': "uast:Position", + offset: 8178, + line: 214, + col: 65, + }, + }, + Name: "template_context_processors", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8145, + line: 214, + col: 32, + }, + }, + Name: "setdefault", + }, + ], + }, + keywords: [], + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8145, + line: 214, + col: 32, + }, + }, + Name: "append", + }, + ], + }, + keywords: [], + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8123, + line: 214, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 8127, + line: 214, + col: 14, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8122, + line: 214, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 8126, + line: 214, + col: 13, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8122, + line: 214, + col: 9, + }, + }, + Name: "_record", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8232, + line: 216, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 8238, + line: 216, + col: 15, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8239, + line: 216, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 8240, + line: 216, + col: 17, + }, + }, + Name: "f", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7944, + line: 210, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 7948, + line: 210, + col: 35, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7944, + line: 210, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 7948, + line: 210, + col: 35, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7950, + line: 210, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 7951, + line: 210, + col: 38, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 7950, + line: 210, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 7951, + line: 210, + col: 38, + }, + }, + Name: "f", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8250, + line: 218, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 8266, + line: 218, + col: 25, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "app_errorhandler", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8451, + line: 223, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8288, + line: 219, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 8462, + line: 223, + col: 12, + }, + }, + Format: "", + Value: "Like :meth:`Flask.errorhandler` but for a module. This\n handler is used for all requests, even if outside of the module.\n\n .. versionadded:: 0.4\n ", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8475, + line: 224, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 8484, + line: 224, + col: 22, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "decorator", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8501, + line: 225, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8501, + line: 225, + col: 13, + }, + }, + args: [ + { '@type': "Lambda", + '@role': [Anonymous, Argument, Call, Declaration, Function, Name, Positional, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8514, + line: 225, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 8520, + line: 225, + col: 32, + }, + }, + args: { '@type': "arguments", + '@role': [Argument, Declaration, Function, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + args: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8521, + line: 225, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 8522, + line: 225, + col: 34, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8521, + line: 225, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 8522, + line: 225, + col: 34, + }, + }, + Name: "s", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + }, + body: { '@type': "FunctionDef.body", + '@role': [Body, Declaration, Function], + 'body_stmts': { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8524, + line: 225, + col: 36, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8549, + line: 225, + col: 61, + }, + end: { '@type': "uast:Position", + offset: 8550, + line: 225, + col: 62, + }, + }, + Name: "f", + }, + ], + func: { '@type': "Call", + '@role': [Call, Callee, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8524, + line: 225, + col: 36, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8543, + line: 225, + col: 55, + }, + end: { '@type': "uast:Position", + offset: 8547, + line: 225, + col: 59, + }, + }, + Name: "code", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8525, + line: 225, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 8526, + line: 225, + col: 38, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8524, + line: 225, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 8525, + line: 225, + col: 37, + }, + }, + Name: "s", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8526, + line: 225, + col: 38, + }, + end: { '@type': "uast:Position", + offset: 8529, + line: 225, + col: 41, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8524, + line: 225, + col: 36, + }, + }, + Name: "errorhandler", + }, + ], + }, + keywords: [], + }, + keywords: [], + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8502, + line: 225, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 8506, + line: 225, + col: 18, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8501, + line: 225, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 8505, + line: 225, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8501, + line: 225, + col: 13, + }, + }, + Name: "_record", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8565, + line: 226, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 8571, + line: 226, + col: 19, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8572, + line: 226, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 8573, + line: 226, + col: 21, + }, + }, + Name: "f", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8485, + line: 224, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 8486, + line: 224, + col: 24, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8485, + line: 224, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 8486, + line: 224, + col: 24, + }, + }, + Name: "f", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8582, + line: 227, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 8588, + line: 227, + col: 15, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8589, + line: 227, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 8598, + line: 227, + col: 25, + }, + }, + Name: "decorator", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8267, + line: 218, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 8271, + line: 218, + col: 30, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8267, + line: 218, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 8271, + line: 218, + col: 30, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8273, + line: 218, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 8277, + line: 218, + col: 36, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8273, + line: 218, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 8277, + line: 218, + col: 36, + }, + }, + Name: "code", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8608, + line: 229, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 8615, + line: 229, + col: 16, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_record", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8637, + line: 230, + col: 9, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8637, + line: 230, + col: 9, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8666, + line: 230, + col: 38, + }, + end: { '@type': "uast:Position", + offset: 8670, + line: 230, + col: 42, + }, + }, + Name: "func", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8638, + line: 230, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 8642, + line: 230, + col: 14, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8637, + line: 230, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 8641, + line: 230, + col: 13, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8642, + line: 230, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 8658, + line: 230, + col: 30, + }, + }, + Name: "_register_events", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8637, + line: 230, + col: 9, + }, + }, + Name: "append", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8616, + line: 229, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 8620, + line: 229, + col: 21, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8616, + line: 229, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 8620, + line: 229, + col: 21, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8622, + line: 229, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 8626, + line: 229, + col: 27, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 8622, + line: 229, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 8626, + line: 229, + col: 27, + }, + }, + Name: "func", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_136_dst.uast b/uast/diff/testdata/testcase_136_dst.uast new file mode 100644 index 00000000..426aa4b3 --- /dev/null +++ b/uast/diff/testdata/testcase_136_dst.uast @@ -0,0 +1,1482 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 215, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 218, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n flask.module\n ~~~~~~~~~~~~\n\n Implements a class that represents module blueprints.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 220, + line: 12, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "os", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 219, + line: 11, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 219, + line: 11, + col: 1, + }, + }, + lines: [], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 231, + line: 14, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 247, + line: 14, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 290, + line: 17, + col: 24, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "blueprint_is_module", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 300, + line: 18, + col: 5, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 300, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 358, + line: 18, + col: 63, + }, + }, + Format: "", + Value: "Used to figure out if something is actually a module", + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 363, + line: 19, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 369, + line: 19, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 370, + line: 19, + col: 12, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 381, + line: 19, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 383, + line: 19, + col: 25, + }, + }, + Name: "bp", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 385, + line: 19, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 391, + line: 19, + col: 33, + }, + }, + Name: "Module", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 370, + line: 19, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 380, + line: 19, + col: 22, + }, + }, + Name: "isinstance", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 291, + line: 17, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 293, + line: 17, + col: 27, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 291, + line: 17, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 293, + line: 17, + col: 27, + }, + }, + Name: "bp", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "ClassDef", + '@token': "Module", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 401, + line: 22, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 407, + line: 22, + col: 13, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 408, + line: 22, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 417, + line: 22, + col: 23, + }, + }, + Name: "Blueprint", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 780, + line: 30, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 424, + line: 23, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 787, + line: 30, + col: 8, + }, + }, + Format: "", + Value: "Deprecated module support. Until Flask 0.6 modules were a different\n name of the concept now available as blueprints in Flask. They are\n essentially doing the same but have some bad semantics for templates and\n static files that were fixed with blueprints.\n\n .. versionchanged:: 0.7\n Modules were deprecated in favor for blueprints.\n ", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 797, + line: 32, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 805, + line: 32, + col: 17, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "__init__", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 913, + line: 34, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 915, + line: 34, + col: 11, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 942, + line: 35, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 948, + line: 35, + col: 19, + }, + }, + msg: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 969, + line: 35, + col: 40, + }, + }, + Format: "", + Value: "name required if package name does not point to a submodule", + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 949, + line: 35, + col: 20, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 956, + line: 35, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 967, + line: 35, + col: 38, + }, + }, + Name: "import_name", + }, + ], + }, + left: { '@type': "uast:String", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 949, + line: 35, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 952, + line: 35, + col: 23, + }, + }, + Format: "", + Value: ".", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "In", + '@token': "in", + '@role': [Contains, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1064, + line: 37, + col: 13, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1064, + line: 37, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1068, + line: 37, + col: 17, + }, + }, + Name: "name", + }, + ], + value: { '@type': "Subscript", + '@role': [Expression, Incomplete, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1071, + line: 37, + col: 20, + }, + }, + ctx: "Load", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "Num", + '@token': 1, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1098, + line: 37, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 1099, + line: 37, + col: 48, + }, + }, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1071, + line: 37, + col: 20, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1082, + line: 37, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 1083, + line: 37, + col: 32, + }, + }, + Format: "", + Value: ".", + }, + { '@type': "Num", + '@token': 1, + '@role': [Argument, Call, Expression, Function, Literal, Name, Number, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1095, + line: 37, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 1096, + line: 37, + col: 45, + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1072, + line: 37, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 1083, + line: 37, + col: 32, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1071, + line: 37, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 1082, + line: 37, + col: 31, + }, + }, + Name: "import_name", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1071, + line: 37, + col: 20, + }, + }, + Name: "rsplit", + }, + ], + }, + keywords: [], + }, + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 916, + line: 34, + col: 12, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 924, + line: 34, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 928, + line: 34, + col: 24, + }, + }, + LiteralValue: "None", + value: ~, + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 916, + line: 34, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 920, + line: 34, + col: 16, + }, + }, + Name: "name", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Is", + '@token': "is", + '@role': [Identical, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1109, + line: 38, + col: 9, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1109, + line: 38, + col: 9, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1128, + line: 38, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 1132, + line: 38, + col: 32, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1134, + line: 38, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 1138, + line: 38, + col: 38, + }, + }, + Name: "name", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1140, + line: 38, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 1151, + line: 38, + col: 51, + }, + }, + Name: "import_name", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1110, + line: 38, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 1119, + line: 38, + col: 19, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1109, + line: 38, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1118, + line: 38, + col: 18, + }, + }, + Name: "Blueprint", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1109, + line: 38, + col: 9, + }, + }, + Name: "__init__", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "url_prefix", + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1153, + line: 38, + col: 53, + }, + end: { '@type': "uast:Position", + offset: 1163, + line: 38, + col: 63, + }, + }, + Name: "url_prefix", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "subdomain", + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1203, + line: 39, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 1212, + line: 39, + col: 37, + }, + }, + Name: "subdomain", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "template_folder", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1240, + line: 39, + col: 65, + }, + end: { '@type': "uast:Position", + offset: 1251, + line: 39, + col: 76, + }, + }, + Format: "", + Value: "templates", + }, + }, + ], + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1262, + line: 41, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1264, + line: 41, + col: 11, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1332, + line: 42, + col: 13, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1333, + line: 42, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 1337, + line: 42, + col: 18, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1332, + line: 42, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1336, + line: 42, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1332, + line: 42, + col: 13, + }, + }, + Name: "_static_folder", + }, + ], + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1354, + line: 42, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 1362, + line: 42, + col: 43, + }, + }, + Format: "", + Value: "static", + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Call", + '@role': [Call, Condition, Expression, Function, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1265, + line: 41, + col: 12, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1279, + line: 41, + col: 26, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1293, + line: 41, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 1297, + line: 41, + col: 44, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1292, + line: 41, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 1296, + line: 41, + col: 43, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1292, + line: 41, + col: 39, + }, + }, + Name: "root_path", + }, + ], + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1308, + line: 41, + col: 55, + }, + end: { '@type': "uast:Position", + offset: 1316, + line: 41, + col: 63, + }, + }, + Format: "", + Value: "static", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1280, + line: 41, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 1282, + line: 41, + col: 29, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1279, + line: 41, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 1281, + line: 41, + col: 28, + }, + }, + Name: "os", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1282, + line: 41, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 1286, + line: 41, + col: 33, + }, + }, + Name: "path", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1279, + line: 41, + col: 26, + }, + }, + Name: "join", + }, + ], + }, + keywords: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1266, + line: 41, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1268, + line: 41, + col: 15, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1265, + line: 41, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 1267, + line: 41, + col: 14, + }, + }, + Name: "os", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1268, + line: 41, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 1272, + line: 41, + col: 19, + }, + }, + Name: "path", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1265, + line: 41, + col: 12, + }, + }, + Name: "isdir", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 806, + line: 32, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 810, + line: 32, + col: 22, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 806, + line: 32, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 810, + line: 32, + col: 22, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 812, + line: 32, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 823, + line: 32, + col: 35, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 812, + line: 32, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 823, + line: 32, + col: 35, + }, + }, + Name: "import_name", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 825, + line: 32, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 829, + line: 32, + col: 41, + }, + }, + Init: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 830, + line: 32, + col: 42, + }, + end: { '@type': "uast:Position", + offset: 834, + line: 32, + col: 46, + }, + }, + LiteralValue: "None", + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 788, + line: 31, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 788, + line: 31, + col: 1, + }, + }, + lines: [], + }, + value: ~, + }, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 825, + line: 32, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 829, + line: 32, + col: 41, + }, + }, + Name: "name", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 836, + line: 32, + col: 48, + }, + end: { '@type': "uast:Position", + offset: 846, + line: 32, + col: 58, + }, + }, + Init: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 847, + line: 32, + col: 59, + }, + end: { '@type': "uast:Position", + offset: 851, + line: 32, + col: 63, + }, + }, + LiteralValue: "None", + value: ~, + }, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 836, + line: 32, + col: 48, + }, + end: { '@type': "uast:Position", + offset: 846, + line: 32, + col: 58, + }, + }, + Name: "url_prefix", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 870, + line: 33, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 881, + line: 33, + col: 29, + }, + }, + Init: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 882, + line: 33, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 886, + line: 33, + col: 34, + }, + }, + LiteralValue: "None", + value: ~, + }, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 870, + line: 33, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 881, + line: 33, + col: 29, + }, + }, + Name: "static_path", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 33, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 897, + line: 33, + col: 45, + }, + }, + Init: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 898, + line: 33, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 902, + line: 33, + col: 50, + }, + }, + LiteralValue: "None", + value: ~, + }, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 33, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 897, + line: 33, + col: 45, + }, + }, + Name: "subdomain", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_136_src.uast b/uast/diff/testdata/testcase_136_src.uast new file mode 100644 index 00000000..fba6d60a --- /dev/null +++ b/uast/diff/testdata/testcase_136_src.uast @@ -0,0 +1,1494 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 215, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 218, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n flask.module\n ~~~~~~~~~~~~\n\n Implements a class that represents module blueprints.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 220, + line: 12, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "os", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 219, + line: 11, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 219, + line: 11, + col: 1, + }, + }, + lines: [], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 231, + line: 14, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 244, + line: 14, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_PackageBoundObject", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_endpoint_from_view_func", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 298, + line: 15, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 314, + line: 15, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 338, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 357, + line: 18, + col: 24, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "blueprint_is_module", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 367, + line: 19, + col: 5, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 367, + line: 19, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 425, + line: 19, + col: 63, + }, + }, + Format: "", + Value: "Used to figure out if something is actually a module", + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 430, + line: 20, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 436, + line: 20, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 437, + line: 20, + col: 12, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 448, + line: 20, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 450, + line: 20, + col: 25, + }, + }, + Name: "bp", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 452, + line: 20, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 458, + line: 20, + col: 33, + }, + }, + Name: "Module", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 437, + line: 20, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 447, + line: 20, + col: 22, + }, + }, + Name: "isinstance", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 358, + line: 18, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 360, + line: 18, + col: 27, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 358, + line: 18, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 360, + line: 18, + col: 27, + }, + }, + Name: "bp", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "ClassDef", + '@token': "Module", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 468, + line: 23, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 474, + line: 23, + col: 13, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 475, + line: 23, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 484, + line: 23, + col: 23, + }, + }, + Name: "Blueprint", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 847, + line: 31, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 491, + line: 24, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 854, + line: 31, + col: 8, + }, + }, + Format: "", + Value: "Deprecated module support. Until Flask 0.6 modules were a different\n name of the concept now available as blueprints in Flask. They are\n essentially doing the same but have some bad semantics for templates and\n static files that were fixed with blueprints.\n\n .. versionchanged:: 0.7\n Modules were deprecated in favor for blueprints.\n ", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 864, + line: 33, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 872, + line: 33, + col: 17, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "__init__", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 980, + line: 35, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 982, + line: 35, + col: 11, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1009, + line: 36, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1015, + line: 36, + col: 19, + }, + }, + msg: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1036, + line: 36, + col: 40, + }, + }, + Format: "", + Value: "name required if package name does not point to a submodule", + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1016, + line: 36, + col: 20, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1023, + line: 36, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 1034, + line: 36, + col: 38, + }, + }, + Name: "import_name", + }, + ], + }, + left: { '@type': "uast:String", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1016, + line: 36, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 1019, + line: 36, + col: 23, + }, + }, + Format: "", + Value: ".", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "In", + '@token': "in", + '@role': [Contains, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1131, + line: 38, + col: 13, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1131, + line: 38, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1135, + line: 38, + col: 17, + }, + }, + Name: "name", + }, + ], + value: { '@type': "Subscript", + '@role': [Expression, Incomplete, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1138, + line: 38, + col: 20, + }, + }, + ctx: "Load", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "Num", + '@token': 1, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1165, + line: 38, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 1166, + line: 38, + col: 48, + }, + }, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1138, + line: 38, + col: 20, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1149, + line: 38, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 1150, + line: 38, + col: 32, + }, + }, + Format: "", + Value: ".", + }, + { '@type': "Num", + '@token': 1, + '@role': [Argument, Call, Expression, Function, Literal, Name, Number, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1162, + line: 38, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 1163, + line: 38, + col: 45, + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1139, + line: 38, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 1150, + line: 38, + col: 32, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1138, + line: 38, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 1149, + line: 38, + col: 31, + }, + }, + Name: "import_name", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1138, + line: 38, + col: 20, + }, + }, + Name: "rsplit", + }, + ], + }, + keywords: [], + }, + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 983, + line: 35, + col: 12, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 991, + line: 35, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 995, + line: 35, + col: 24, + }, + }, + LiteralValue: "None", + value: ~, + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 983, + line: 35, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 987, + line: 35, + col: 16, + }, + }, + Name: "name", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Is", + '@token': "is", + '@role': [Identical, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1176, + line: 39, + col: 9, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1176, + line: 39, + col: 9, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1195, + line: 39, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 1199, + line: 39, + col: 32, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1201, + line: 39, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 1205, + line: 39, + col: 38, + }, + }, + Name: "name", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1207, + line: 39, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 1218, + line: 39, + col: 51, + }, + }, + Name: "import_name", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1177, + line: 39, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 1186, + line: 39, + col: 19, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1176, + line: 39, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1185, + line: 39, + col: 18, + }, + }, + Name: "Blueprint", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1176, + line: 39, + col: 9, + }, + }, + Name: "__init__", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "url_prefix", + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1220, + line: 39, + col: 53, + }, + end: { '@type': "uast:Position", + offset: 1230, + line: 39, + col: 63, + }, + }, + Name: "url_prefix", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "subdomain", + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1270, + line: 40, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 1279, + line: 40, + col: 37, + }, + }, + Name: "subdomain", + }, + }, + ], + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1300, + line: 42, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1302, + line: 42, + col: 11, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1370, + line: 43, + col: 13, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1371, + line: 43, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 1375, + line: 43, + col: 18, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1370, + line: 43, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1374, + line: 43, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1370, + line: 43, + col: 13, + }, + }, + Name: "_static_folder", + }, + ], + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1392, + line: 43, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 1400, + line: 43, + col: 43, + }, + }, + Format: "", + Value: "static", + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Call", + '@role': [Call, Condition, Expression, Function, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1303, + line: 42, + col: 12, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1317, + line: 42, + col: 26, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1331, + line: 42, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 1335, + line: 42, + col: 44, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1330, + line: 42, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 1334, + line: 42, + col: 43, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1330, + line: 42, + col: 39, + }, + }, + Name: "root_path", + }, + ], + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1346, + line: 42, + col: 55, + }, + end: { '@type': "uast:Position", + offset: 1354, + line: 42, + col: 63, + }, + }, + Format: "", + Value: "static", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1318, + line: 42, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 1320, + line: 42, + col: 29, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1317, + line: 42, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 1319, + line: 42, + col: 28, + }, + }, + Name: "os", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1320, + line: 42, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 1324, + line: 42, + col: 33, + }, + }, + Name: "path", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1317, + line: 42, + col: 26, + }, + }, + Name: "join", + }, + ], + }, + keywords: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1304, + line: 42, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1306, + line: 42, + col: 15, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1303, + line: 42, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 1305, + line: 42, + col: 14, + }, + }, + Name: "os", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1306, + line: 42, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 1310, + line: 42, + col: 19, + }, + }, + Name: "path", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1303, + line: 42, + col: 12, + }, + }, + Name: "isdir", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 873, + line: 33, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 877, + line: 33, + col: 22, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 873, + line: 33, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 877, + line: 33, + col: 22, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 879, + line: 33, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 890, + line: 33, + col: 35, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 879, + line: 33, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 890, + line: 33, + col: 35, + }, + }, + Name: "import_name", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 892, + line: 33, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 896, + line: 33, + col: 41, + }, + }, + Init: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 897, + line: 33, + col: 42, + }, + end: { '@type': "uast:Position", + offset: 901, + line: 33, + col: 46, + }, + }, + LiteralValue: "None", + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 855, + line: 32, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 855, + line: 32, + col: 1, + }, + }, + lines: [], + }, + value: ~, + }, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 892, + line: 33, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 896, + line: 33, + col: 41, + }, + }, + Name: "name", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 903, + line: 33, + col: 48, + }, + end: { '@type': "uast:Position", + offset: 913, + line: 33, + col: 58, + }, + }, + Init: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 914, + line: 33, + col: 59, + }, + end: { '@type': "uast:Position", + offset: 918, + line: 33, + col: 63, + }, + }, + LiteralValue: "None", + value: ~, + }, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 903, + line: 33, + col: 48, + }, + end: { '@type': "uast:Position", + offset: 913, + line: 33, + col: 58, + }, + }, + Name: "url_prefix", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 937, + line: 34, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 948, + line: 34, + col: 29, + }, + }, + Init: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 949, + line: 34, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 953, + line: 34, + col: 34, + }, + }, + LiteralValue: "None", + value: ~, + }, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 937, + line: 34, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 948, + line: 34, + col: 29, + }, + }, + Name: "static_path", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 955, + line: 34, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 964, + line: 34, + col: 45, + }, + }, + Init: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 965, + line: 34, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 969, + line: 34, + col: 50, + }, + }, + LiteralValue: "None", + value: ~, + }, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 955, + line: 34, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 964, + line: 34, + col: 45, + }, + }, + Name: "subdomain", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_137_dst.uast b/uast/diff/testdata/testcase_137_dst.uast new file mode 100644 index 00000000..cee2fe48 --- /dev/null +++ b/uast/diff/testdata/testcase_137_dst.uast @@ -0,0 +1,255 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 258, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask.session\n ~~~~~~~~~~~~~\n\n This module used to flask with the session global so we moved it\n over to flask.sessions\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 260, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 273, + line: 13, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "warn", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "warnings", + }, + Target: ~, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 286, + line: 14, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 286, + line: 14, + col: 1, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 291, + line: 14, + col: 6, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 310, + line: 14, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 345, + line: 14, + col: 60, + }, + }, + Format: "", + Value: "please use flask.sessions instead", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 291, + line: 14, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 309, + line: 14, + col: 24, + }, + }, + Name: "DeprecationWarning", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 286, + line: 14, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 290, + line: 14, + col: 5, + }, + }, + Name: "warn", + }, + keywords: [], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 349, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 363, + line: 16, + col: 15, + }, + }, + All: true, + Names: ~, + Path: { '@type': "uast:Identifier", + Name: "../sessions", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 18, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 381, + line: 18, + col: 8, + }, + }, + Name: "Session", + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 384, + line: 18, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 403, + line: 18, + col: 30, + }, + }, + Name: "SecureCookieSession", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 404, + line: 19, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 404, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 416, + line: 19, + col: 13, + }, + }, + Name: "_NullSession", + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 419, + line: 19, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 430, + line: 19, + col: 27, + }, + }, + Name: "NullSession", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_137_src.uast b/uast/diff/testdata/testcase_137_src.uast new file mode 100644 index 00000000..7775525f --- /dev/null +++ b/uast/diff/testdata/testcase_137_src.uast @@ -0,0 +1,1088 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 242, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 245, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask.session\n ~~~~~~~~~~~~~\n\n Implements cookie based sessions based on Werkzeug's secure cookie\n system.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 247, + line: 13, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "SecureCookie", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.contrib.securecookie", + }, + Target: ~, + }, + { '@type': "ClassDef", + '@token': "Session", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 310, + line: 16, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 317, + line: 16, + col: 14, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 318, + line: 16, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 330, + line: 16, + col: 27, + }, + }, + Name: "SecureCookie", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 437, + line: 19, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 337, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 444, + line: 19, + col: 8, + }, + }, + Format: "", + Value: "Expands the session with support for switching between permanent\n and non-permanent sessions.\n ", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 454, + line: 21, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 468, + line: 21, + col: 23, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_get_permanent", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 484, + line: 22, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 490, + line: 22, + col: 15, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 491, + line: 22, + col: 16, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 500, + line: 22, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 512, + line: 22, + col: 37, + }, + }, + Format: "", + Value: "_permanent", + }, + { '@type': "BoolLiteral", + '@token': "False", + '@role': [Argument, Boolean, Call, Expression, Function, Literal, Name, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 514, + line: 22, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 519, + line: 22, + col: 44, + }, + }, + value: false, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 492, + line: 22, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 496, + line: 22, + col: 21, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 491, + line: 22, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 495, + line: 22, + col: 20, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 491, + line: 22, + col: 16, + }, + }, + Name: "get", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 469, + line: 21, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 473, + line: 21, + col: 28, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 469, + line: 21, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 473, + line: 21, + col: 28, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 530, + line: 24, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 544, + line: 24, + col: 23, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_set_permanent", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 567, + line: 25, + col: 9, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 567, + line: 25, + col: 9, + }, + }, + ctx: "Store", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 572, + line: 25, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 584, + line: 25, + col: 26, + }, + }, + Format: "", + Value: "_permanent", + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 567, + line: 25, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 571, + line: 25, + col: 13, + }, + }, + Name: "self", + }, + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 588, + line: 25, + col: 30, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 593, + line: 25, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 598, + line: 25, + col: 40, + }, + }, + Name: "value", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 588, + line: 25, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 592, + line: 25, + col: 34, + }, + }, + Name: "bool", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 545, + line: 24, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 549, + line: 24, + col: 28, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 545, + line: 24, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 549, + line: 24, + col: 28, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 551, + line: 24, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 556, + line: 24, + col: 35, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 551, + line: 24, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 556, + line: 24, + col: 35, + }, + }, + Name: "value", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 605, + line: 27, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 605, + line: 27, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 614, + line: 27, + col: 14, + }, + }, + Name: "permanent", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 617, + line: 27, + col: 17, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 626, + line: 27, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 640, + line: 27, + col: 40, + }, + }, + Name: "_get_permanent", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 642, + line: 27, + col: 42, + }, + end: { '@type': "uast:Position", + offset: 656, + line: 27, + col: 56, + }, + }, + Name: "_set_permanent", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 617, + line: 27, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 625, + line: 27, + col: 25, + }, + }, + Name: "property", + }, + keywords: [], + }, + }, + { '@type': "Delete", + '@token': "del", + '@role': [Incomplete, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 662, + line: 28, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 665, + line: 28, + col: 8, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 666, + line: 28, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 680, + line: 28, + col: 23, + }, + }, + Name: "_get_permanent", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 682, + line: 28, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 696, + line: 28, + col: 39, + }, + }, + Name: "_set_permanent", + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "ClassDef", + '@token': "_NullSession", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 705, + line: 31, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 717, + line: 31, + col: 19, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 718, + line: 31, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 725, + line: 31, + col: 27, + }, + }, + Name: "Session", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 895, + line: 35, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 732, + line: 32, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 902, + line: 35, + col: 8, + }, + }, + Format: "", + Value: "Class used to generate nicer error messages if sessions are not\n available. Will still allow read-only access to the empty session\n but fail on setting.\n ", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 912, + line: 37, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 917, + line: 37, + col: 14, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_fail", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Raise", + '@token': "raise", + '@role': [Statement, Throw], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 950, + line: 38, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 955, + line: 38, + col: 14, + }, + }, + cause: ~, + exc: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 956, + line: 38, + col: 15, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 969, + line: 38, + col: 28, + }, + }, + Format: "", + Value: "the session is unavailable because no secret key was set. Set the secret_key on the application to something unique and secret.", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 956, + line: 38, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 968, + line: 38, + col: 27, + }, + }, + Name: "RuntimeError", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 918, + line: 37, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 922, + line: 37, + col: 19, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 918, + line: 37, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 922, + line: 37, + col: 19, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 933, + line: 37, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 939, + line: 37, + col: 36, + }, + }, + Init: ~, + MapVariadic: true, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 933, + line: 37, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 939, + line: 37, + col: 36, + }, + }, + Name: "kwargs", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 925, + line: 37, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 929, + line: 37, + col: 26, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 925, + line: 37, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 929, + line: 37, + col: 26, + }, + }, + Name: "args", + }, + Receiver: false, + Type: ~, + Variadic: true, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1165, + line: 41, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1165, + line: 41, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1176, + line: 41, + col: 16, + }, + }, + Name: "__setitem__", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1179, + line: 41, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 1190, + line: 41, + col: 30, + }, + }, + Name: "__delitem__", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1193, + line: 41, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 1198, + line: 41, + col: 38, + }, + }, + Name: "clear", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1201, + line: 41, + col: 41, + }, + end: { '@type': "uast:Position", + offset: 1204, + line: 41, + col: 44, + }, + }, + Name: "pop", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1207, + line: 41, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 1214, + line: 41, + col: 54, + }, + }, + Name: "popitem", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1227, + line: 42, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1233, + line: 42, + col: 15, + }, + }, + Name: "update", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1236, + line: 42, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 1246, + line: 42, + col: 28, + }, + }, + Name: "setdefault", + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1249, + line: 42, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 1254, + line: 42, + col: 36, + }, + }, + Name: "_fail", + }, + }, + { '@type': "Delete", + '@token': "del", + '@role': [Incomplete, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1259, + line: 43, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1262, + line: 43, + col: 8, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1263, + line: 43, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1268, + line: 43, + col: 14, + }, + }, + Name: "_fail", + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_138_dst.uast b/uast/diff/testdata/testcase_138_dst.uast new file mode 100644 index 00000000..9ab45717 --- /dev/null +++ b/uast/diff/testdata/testcase_138_dst.uast @@ -0,0 +1,1504 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 205, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 208, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n flask.logging\n ~~~~~~~~~~~~~\n\n Implements the logging support for Flask.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 210, + line: 12, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 225, + line: 12, + col: 16, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "absolute_import", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "__future__", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 250, + line: 14, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 262, + line: 14, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "getLogger", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "StreamHandler", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Formatter", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "getLoggerClass", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "DEBUG", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "logging", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 335, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 348, + line: 17, + col: 18, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "create_logger", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 670, + line: 23, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 359, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 677, + line: 23, + col: 8, + }, + }, + Format: "", + Value: "Creates a logger for the given application. This logger works\n similar to a regular Python logger but changes the effective logging\n level based on the application's debug flag. Furthermore this\n function also removes all attached handlers in case there was a\n logger with the log name before.\n ", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 682, + line: 24, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 682, + line: 24, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 688, + line: 24, + col: 11, + }, + }, + Name: "Logger", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 691, + line: 24, + col: 14, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 691, + line: 24, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 705, + line: 24, + col: 28, + }, + }, + Name: "getLoggerClass", + }, + keywords: [], + }, + }, + { '@type': "ClassDef", + '@token': "DebugLogger", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 719, + line: 26, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 730, + line: 26, + col: 22, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 731, + line: 26, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 737, + line: 26, + col: 29, + }, + }, + Name: "Logger", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 752, + line: 27, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 769, + line: 27, + col: 30, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "getEffectiveLevel", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 786, + line: 28, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 792, + line: 28, + col: 19, + }, + }, + value: { '@type': "IfExp", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 793, + line: 28, + col: 20, + }, + }, + body: { '@type': "uast:Identifier", + '@role': [Body, If, Then], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 793, + line: 28, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 798, + line: 28, + col: 25, + }, + }, + Name: "DEBUG", + }, + orelse: { '@type': "Call", + '@role': [Body, Call, Else, Expression, Function, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 817, + line: 28, + col: 44, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 842, + line: 28, + col: 69, + }, + end: { '@type': "uast:Position", + offset: 843, + line: 28, + col: 70, + }, + }, + Name: "x", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 818, + line: 28, + col: 45, + }, + end: { '@type': "uast:Position", + offset: 824, + line: 28, + col: 51, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 817, + line: 28, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 823, + line: 28, + col: 50, + }, + }, + Name: "Logger", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 817, + line: 28, + col: 44, + }, + }, + Name: "getEffectiveLevel", + }, + ], + }, + keywords: [], + }, + test: { '@type': "QualifiedIdentifier", + '@role': [Condition, Expression, Identifier, If, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 803, + line: 28, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 806, + line: 28, + col: 33, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 802, + line: 28, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 805, + line: 28, + col: 32, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 802, + line: 28, + col: 29, + }, + }, + Name: "debug", + }, + ], + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 770, + line: 27, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 771, + line: 27, + col: 32, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 770, + line: 27, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 771, + line: 27, + col: 32, + }, + }, + Name: "x", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "ClassDef", + '@token': "DebugHandler", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 856, + line: 30, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 868, + line: 30, + col: 23, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 869, + line: 30, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 882, + line: 30, + col: 37, + }, + }, + Name: "StreamHandler", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 897, + line: 31, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 901, + line: 31, + col: 17, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "emit", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 926, + line: 32, + col: 13, + }, + }, + value: { '@type': "IfExp", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 926, + line: 32, + col: 13, + }, + }, + body: { '@type': "Call", + '@role': [Body, Call, Expression, Function, If, Then], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 926, + line: 32, + col: 13, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 945, + line: 32, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 946, + line: 32, + col: 33, + }, + }, + Name: "x", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 948, + line: 32, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 954, + line: 32, + col: 41, + }, + }, + Name: "record", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 927, + line: 32, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 940, + line: 32, + col: 27, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 926, + line: 32, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 939, + line: 32, + col: 26, + }, + }, + Name: "StreamHandler", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 926, + line: 32, + col: 13, + }, + }, + Name: "emit", + }, + ], + }, + keywords: [], + }, + orelse: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Body, Else, Expression, If, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 974, + line: 32, + col: 61, + }, + end: { '@type': "uast:Position", + offset: 978, + line: 32, + col: 65, + }, + }, + LiteralValue: "None", + value: ~, + }, + test: { '@type': "QualifiedIdentifier", + '@role': [Condition, Expression, Identifier, If, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 960, + line: 32, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 963, + line: 32, + col: 50, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 959, + line: 32, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 962, + line: 32, + col: 49, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 959, + line: 32, + col: 46, + }, + }, + Name: "debug", + }, + ], + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 902, + line: 31, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 903, + line: 31, + col: 19, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 902, + line: 31, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 903, + line: 31, + col: 19, + }, + }, + Name: "x", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 905, + line: 31, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 911, + line: 31, + col: 27, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 905, + line: 31, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 911, + line: 31, + col: 27, + }, + }, + Name: "record", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 984, + line: 34, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 984, + line: 34, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 991, + line: 34, + col: 12, + }, + }, + Name: "handler", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 994, + line: 34, + col: 15, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 994, + line: 34, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 1006, + line: 34, + col: 27, + }, + }, + Name: "DebugHandler", + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1013, + line: 35, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1013, + line: 35, + col: 5, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1030, + line: 35, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 1035, + line: 35, + col: 27, + }, + }, + Name: "DEBUG", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1014, + line: 35, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 1021, + line: 35, + col: 13, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1013, + line: 35, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1020, + line: 35, + col: 12, + }, + }, + Name: "handler", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1013, + line: 35, + col: 5, + }, + }, + Name: "setLevel", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1041, + line: 36, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1041, + line: 36, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1062, + line: 36, + col: 26, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1073, + line: 36, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 1076, + line: 36, + col: 40, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1072, + line: 36, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 1075, + line: 36, + col: 39, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1072, + line: 36, + col: 36, + }, + }, + Name: "debug_log_format", + }, + ], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1062, + line: 36, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 1071, + line: 36, + col: 35, + }, + }, + Name: "Formatter", + }, + keywords: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1042, + line: 36, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 1049, + line: 36, + col: 13, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1041, + line: 36, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1048, + line: 36, + col: 12, + }, + }, + Name: "handler", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1041, + line: 36, + col: 5, + }, + }, + Name: "setFormatter", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1099, + line: 37, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1099, + line: 37, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1105, + line: 37, + col: 11, + }, + }, + Name: "logger", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1108, + line: 37, + col: 14, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1119, + line: 37, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 1122, + line: 37, + col: 28, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1118, + line: 37, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 1121, + line: 37, + col: 27, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1118, + line: 37, + col: 24, + }, + }, + Name: "logger_name", + }, + ], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1108, + line: 37, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 1117, + line: 37, + col: 23, + }, + }, + Name: "getLogger", + }, + keywords: [], + }, + }, + { '@type': "Delete", + '@token': "del", + '@role': [Incomplete, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1243, + line: 40, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1246, + line: 40, + col: 8, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1247, + line: 40, + col: 9, + }, + }, + ctx: "Del", + slice: { '@type': "Slice", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + lower: ~, + step: ~, + upper: ~, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1248, + line: 40, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 1254, + line: 40, + col: 16, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1247, + line: 40, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1253, + line: 40, + col: 15, + }, + }, + Name: "logger", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1247, + line: 40, + col: 9, + }, + }, + Name: "handlers", + }, + ], + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1270, + line: 41, + col: 5, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1271, + line: 41, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 1277, + line: 41, + col: 12, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1270, + line: 41, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1276, + line: 41, + col: 11, + }, + }, + Name: "logger", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1270, + line: 41, + col: 5, + }, + }, + Name: "__class__", + }, + ], + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1289, + line: 41, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 1300, + line: 41, + col: 35, + }, + }, + Name: "DebugLogger", + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1305, + line: 42, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1305, + line: 42, + col: 5, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1323, + line: 42, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 1330, + line: 42, + col: 30, + }, + }, + Name: "handler", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1306, + line: 42, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 1312, + line: 42, + col: 12, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1305, + line: 42, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1311, + line: 42, + col: 11, + }, + }, + Name: "logger", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1305, + line: 42, + col: 5, + }, + }, + Name: "addHandler", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1336, + line: 43, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1342, + line: 43, + col: 11, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1343, + line: 43, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 1349, + line: 43, + col: 18, + }, + }, + Name: "logger", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 349, + line: 17, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 352, + line: 17, + col: 22, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 349, + line: 17, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 352, + line: 17, + col: 22, + }, + }, + Name: "app", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_138_src.uast b/uast/diff/testdata/testcase_138_src.uast new file mode 100644 index 00000000..914db487 --- /dev/null +++ b/uast/diff/testdata/testcase_138_src.uast @@ -0,0 +1,1504 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 205, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 208, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n flask.logging\n ~~~~~~~~~~~~~\n\n Implements the logging support for Flask.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 210, + line: 12, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 225, + line: 12, + col: 16, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "absolute_import", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "__future__", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 250, + line: 14, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 262, + line: 14, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "getLogger", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "StreamHandler", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Formatter", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "getLoggerClass", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "DEBUG", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "logging", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 335, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 348, + line: 17, + col: 18, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "create_logger", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 670, + line: 23, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 359, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 677, + line: 23, + col: 8, + }, + }, + Format: "", + Value: "Creates a logger for the given application. This logger works\n similar to a regular Python logger but changes the effective logging\n level based on the application's debug flag. Furthermore this\n function also removes all attached handlers in case there was a\n logger with the log name before.\n ", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 682, + line: 24, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 682, + line: 24, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 688, + line: 24, + col: 11, + }, + }, + Name: "Logger", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 691, + line: 24, + col: 14, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 691, + line: 24, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 705, + line: 24, + col: 28, + }, + }, + Name: "getLoggerClass", + }, + keywords: [], + }, + }, + { '@type': "ClassDef", + '@token': "DebugLogger", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 719, + line: 26, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 730, + line: 26, + col: 22, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 731, + line: 26, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 737, + line: 26, + col: 29, + }, + }, + Name: "Logger", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 752, + line: 27, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 769, + line: 27, + col: 30, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "getEffectiveLevel", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 786, + line: 28, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 792, + line: 28, + col: 19, + }, + }, + value: { '@type': "IfExp", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 793, + line: 28, + col: 20, + }, + }, + body: { '@type': "uast:Identifier", + '@role': [Body, If, Then], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 793, + line: 28, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 798, + line: 28, + col: 25, + }, + }, + Name: "DEBUG", + }, + orelse: { '@type': "Call", + '@role': [Body, Call, Else, Expression, Function, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 817, + line: 28, + col: 44, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 842, + line: 28, + col: 69, + }, + end: { '@type': "uast:Position", + offset: 843, + line: 28, + col: 70, + }, + }, + Name: "x", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 818, + line: 28, + col: 45, + }, + end: { '@type': "uast:Position", + offset: 824, + line: 28, + col: 51, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 817, + line: 28, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 823, + line: 28, + col: 50, + }, + }, + Name: "Logger", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 817, + line: 28, + col: 44, + }, + }, + Name: "getEffectiveLevel", + }, + ], + }, + keywords: [], + }, + test: { '@type': "QualifiedIdentifier", + '@role': [Condition, Expression, Identifier, If, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 803, + line: 28, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 806, + line: 28, + col: 33, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 802, + line: 28, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 805, + line: 28, + col: 32, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 802, + line: 28, + col: 29, + }, + }, + Name: "debug", + }, + ], + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 770, + line: 27, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 771, + line: 27, + col: 32, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 770, + line: 27, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 771, + line: 27, + col: 32, + }, + }, + Name: "x", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "ClassDef", + '@token': "DebugHandler", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 856, + line: 30, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 868, + line: 30, + col: 23, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 869, + line: 30, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 882, + line: 30, + col: 37, + }, + }, + Name: "StreamHandler", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 897, + line: 31, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 901, + line: 31, + col: 17, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "emit", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 926, + line: 32, + col: 13, + }, + }, + value: { '@type': "IfExp", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 926, + line: 32, + col: 13, + }, + }, + body: { '@type': "Call", + '@role': [Body, Call, Expression, Function, If, Then], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 926, + line: 32, + col: 13, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 945, + line: 32, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 946, + line: 32, + col: 33, + }, + }, + Name: "x", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 948, + line: 32, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 954, + line: 32, + col: 41, + }, + }, + Name: "record", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 927, + line: 32, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 940, + line: 32, + col: 27, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 926, + line: 32, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 939, + line: 32, + col: 26, + }, + }, + Name: "StreamHandler", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 926, + line: 32, + col: 13, + }, + }, + Name: "emit", + }, + ], + }, + keywords: [], + }, + orelse: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Body, Else, Expression, If, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 974, + line: 32, + col: 61, + }, + end: { '@type': "uast:Position", + offset: 978, + line: 32, + col: 65, + }, + }, + LiteralValue: "None", + value: ~, + }, + test: { '@type': "QualifiedIdentifier", + '@role': [Condition, Expression, Identifier, If, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 960, + line: 32, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 963, + line: 32, + col: 50, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 959, + line: 32, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 962, + line: 32, + col: 49, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 959, + line: 32, + col: 46, + }, + }, + Name: "debug", + }, + ], + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 902, + line: 31, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 903, + line: 31, + col: 19, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 902, + line: 31, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 903, + line: 31, + col: 19, + }, + }, + Name: "x", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 905, + line: 31, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 911, + line: 31, + col: 27, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 905, + line: 31, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 911, + line: 31, + col: 27, + }, + }, + Name: "record", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 984, + line: 34, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 984, + line: 34, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 991, + line: 34, + col: 12, + }, + }, + Name: "handler", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 994, + line: 34, + col: 15, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 994, + line: 34, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 1006, + line: 34, + col: 27, + }, + }, + Name: "DebugHandler", + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1013, + line: 35, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1013, + line: 35, + col: 5, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1030, + line: 35, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 1035, + line: 35, + col: 27, + }, + }, + Name: "DEBUG", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1014, + line: 35, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 1021, + line: 35, + col: 13, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1013, + line: 35, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1020, + line: 35, + col: 12, + }, + }, + Name: "handler", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1013, + line: 35, + col: 5, + }, + }, + Name: "setLevel", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1041, + line: 36, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1041, + line: 36, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1062, + line: 36, + col: 26, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1073, + line: 36, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 1076, + line: 36, + col: 40, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1072, + line: 36, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 1075, + line: 36, + col: 39, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1072, + line: 36, + col: 36, + }, + }, + Name: "debug_log_format", + }, + ], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1062, + line: 36, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 1071, + line: 36, + col: 35, + }, + }, + Name: "Formatter", + }, + keywords: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1042, + line: 36, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 1049, + line: 36, + col: 13, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1041, + line: 36, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1048, + line: 36, + col: 12, + }, + }, + Name: "handler", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1041, + line: 36, + col: 5, + }, + }, + Name: "setFormatter", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1099, + line: 37, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1099, + line: 37, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1105, + line: 37, + col: 11, + }, + }, + Name: "logger", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1108, + line: 37, + col: 14, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1119, + line: 37, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 1122, + line: 37, + col: 28, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1118, + line: 37, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 1121, + line: 37, + col: 27, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1118, + line: 37, + col: 24, + }, + }, + Name: "logger_name", + }, + ], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1108, + line: 37, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 1117, + line: 37, + col: 23, + }, + }, + Name: "getLogger", + }, + keywords: [], + }, + }, + { '@type': "Delete", + '@token': "del", + '@role': [Incomplete, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1243, + line: 40, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1246, + line: 40, + col: 8, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1247, + line: 40, + col: 9, + }, + }, + ctx: "Del", + slice: { '@type': "Slice", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + lower: ~, + step: ~, + upper: ~, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1248, + line: 40, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 1254, + line: 40, + col: 16, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1247, + line: 40, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1253, + line: 40, + col: 15, + }, + }, + Name: "logger", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1247, + line: 40, + col: 9, + }, + }, + Name: "handlers", + }, + ], + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1270, + line: 41, + col: 5, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1271, + line: 41, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 1277, + line: 41, + col: 12, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1270, + line: 41, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1276, + line: 41, + col: 11, + }, + }, + Name: "logger", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1270, + line: 41, + col: 5, + }, + }, + Name: "__class__", + }, + ], + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1289, + line: 41, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 1300, + line: 41, + col: 35, + }, + }, + Name: "DebugLogger", + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1305, + line: 42, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1305, + line: 42, + col: 5, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1323, + line: 42, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 1330, + line: 42, + col: 30, + }, + }, + Name: "handler", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1306, + line: 42, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 1312, + line: 42, + col: 12, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1305, + line: 42, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1311, + line: 42, + col: 11, + }, + }, + Name: "logger", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1305, + line: 42, + col: 5, + }, + }, + Name: "addHandler", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1336, + line: 43, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1342, + line: 43, + col: 11, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1343, + line: 43, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 1349, + line: 43, + col: 18, + }, + }, + Name: "logger", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 349, + line: 17, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 352, + line: 17, + col: 22, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 349, + line: 17, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 352, + line: 17, + col: 22, + }, + }, + Name: "app", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_139_dst.uast b/uast/diff/testdata/testcase_139_dst.uast new file mode 100644 index 00000000..4222605b --- /dev/null +++ b/uast/diff/testdata/testcase_139_dst.uast @@ -0,0 +1,1638 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 205, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 208, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n flask.logging\n ~~~~~~~~~~~~~\n\n Implements the logging support for Flask.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 210, + line: 12, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 225, + line: 12, + col: 16, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "absolute_import", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "__future__", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 250, + line: 14, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 262, + line: 14, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "getLogger", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "StreamHandler", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Formatter", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "getLoggerClass", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "DEBUG", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "logging", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 335, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 348, + line: 17, + col: 18, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "create_logger", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 670, + line: 23, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 359, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 677, + line: 23, + col: 8, + }, + }, + Format: "", + Value: "Creates a logger for the given application. This logger works\n similar to a regular Python logger but changes the effective logging\n level based on the application's debug flag. Furthermore this\n function also removes all attached handlers in case there was a\n logger with the log name before.\n ", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 682, + line: 24, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 682, + line: 24, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 688, + line: 24, + col: 11, + }, + }, + Name: "Logger", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 691, + line: 24, + col: 14, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 691, + line: 24, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 705, + line: 24, + col: 28, + }, + }, + Name: "getLoggerClass", + }, + keywords: [], + }, + }, + { '@type': "ClassDef", + '@token': "DebugLogger", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 719, + line: 26, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 730, + line: 26, + col: 22, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 731, + line: 26, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 737, + line: 26, + col: 29, + }, + }, + Name: "Logger", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 752, + line: 27, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 769, + line: 27, + col: 30, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "getEffectiveLevel", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 786, + line: 28, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 788, + line: 28, + col: 15, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 833, + line: 29, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 839, + line: 29, + col: 23, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 840, + line: 29, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 845, + line: 29, + col: 29, + }, + }, + Name: "DEBUG", + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "BoolOp", + '@role': [Boolean, Condition, If, Incomplete, Literal], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 789, + line: 28, + col: 16, + }, + }, + op: { '@type': "And", + '@token': "and", + '@role': [And, Boolean, Operator], + '@pos': { '@type': "uast:Positions", + }, + }, + values: [ + { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 789, + line: 28, + col: 16, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "Num", + '@token': 0, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 800, + line: 28, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 801, + line: 28, + col: 28, + }, + }, + }, + ], + }, + left: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 790, + line: 28, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 791, + line: 28, + col: 18, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 789, + line: 28, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 790, + line: 28, + col: 17, + }, + }, + Name: "x", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 789, + line: 28, + col: 16, + }, + }, + Name: "level", + }, + ], + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 807, + line: 28, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 810, + line: 28, + col: 37, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 806, + line: 28, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 809, + line: 28, + col: 36, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 806, + line: 28, + col: 33, + }, + }, + Name: "debug", + }, + ], + }, + ], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 858, + line: 30, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 864, + line: 30, + col: 19, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 865, + line: 30, + col: 20, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 890, + line: 30, + col: 45, + }, + end: { '@type': "uast:Position", + offset: 891, + line: 30, + col: 46, + }, + }, + Name: "x", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 866, + line: 30, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 872, + line: 30, + col: 27, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 865, + line: 30, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 871, + line: 30, + col: 26, + }, + }, + Name: "Logger", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 865, + line: 30, + col: 20, + }, + }, + Name: "getEffectiveLevel", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 770, + line: 27, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 771, + line: 27, + col: 32, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 770, + line: 27, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 771, + line: 27, + col: 32, + }, + }, + Name: "x", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "ClassDef", + '@token': "DebugHandler", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 904, + line: 32, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 916, + line: 32, + col: 23, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 917, + line: 32, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 930, + line: 32, + col: 37, + }, + }, + Name: "StreamHandler", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 945, + line: 33, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 949, + line: 33, + col: 17, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "emit", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 974, + line: 34, + col: 13, + }, + }, + value: { '@type': "IfExp", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 974, + line: 34, + col: 13, + }, + }, + body: { '@type': "Call", + '@role': [Body, Call, Expression, Function, If, Then], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 974, + line: 34, + col: 13, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 993, + line: 34, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 994, + line: 34, + col: 33, + }, + }, + Name: "x", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 996, + line: 34, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 1002, + line: 34, + col: 41, + }, + }, + Name: "record", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 975, + line: 34, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 988, + line: 34, + col: 27, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 974, + line: 34, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 987, + line: 34, + col: 26, + }, + }, + Name: "StreamHandler", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 974, + line: 34, + col: 13, + }, + }, + Name: "emit", + }, + ], + }, + keywords: [], + }, + orelse: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Body, Else, Expression, If, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1022, + line: 34, + col: 61, + }, + end: { '@type': "uast:Position", + offset: 1026, + line: 34, + col: 65, + }, + }, + LiteralValue: "None", + value: ~, + }, + test: { '@type': "QualifiedIdentifier", + '@role': [Condition, Expression, Identifier, If, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1008, + line: 34, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 1011, + line: 34, + col: 50, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1007, + line: 34, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 1010, + line: 34, + col: 49, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1007, + line: 34, + col: 46, + }, + }, + Name: "debug", + }, + ], + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 950, + line: 33, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 951, + line: 33, + col: 19, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 950, + line: 33, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 951, + line: 33, + col: 19, + }, + }, + Name: "x", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 953, + line: 33, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 959, + line: 33, + col: 27, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 953, + line: 33, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 959, + line: 33, + col: 27, + }, + }, + Name: "record", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1032, + line: 36, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1032, + line: 36, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1039, + line: 36, + col: 12, + }, + }, + Name: "handler", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1042, + line: 36, + col: 15, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1042, + line: 36, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 1054, + line: 36, + col: 27, + }, + }, + Name: "DebugHandler", + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1061, + line: 37, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1061, + line: 37, + col: 5, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1078, + line: 37, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 1083, + line: 37, + col: 27, + }, + }, + Name: "DEBUG", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1062, + line: 37, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 1069, + line: 37, + col: 13, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1061, + line: 37, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1068, + line: 37, + col: 12, + }, + }, + Name: "handler", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1061, + line: 37, + col: 5, + }, + }, + Name: "setLevel", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1089, + line: 38, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1089, + line: 38, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1110, + line: 38, + col: 26, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1121, + line: 38, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 1124, + line: 38, + col: 40, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1120, + line: 38, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 1123, + line: 38, + col: 39, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1120, + line: 38, + col: 36, + }, + }, + Name: "debug_log_format", + }, + ], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1110, + line: 38, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 1119, + line: 38, + col: 35, + }, + }, + Name: "Formatter", + }, + keywords: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1090, + line: 38, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 1097, + line: 38, + col: 13, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1089, + line: 38, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1096, + line: 38, + col: 12, + }, + }, + Name: "handler", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1089, + line: 38, + col: 5, + }, + }, + Name: "setFormatter", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1147, + line: 39, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1147, + line: 39, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1153, + line: 39, + col: 11, + }, + }, + Name: "logger", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1156, + line: 39, + col: 14, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1167, + line: 39, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 1170, + line: 39, + col: 28, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1166, + line: 39, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 1169, + line: 39, + col: 27, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1166, + line: 39, + col: 24, + }, + }, + Name: "logger_name", + }, + ], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1156, + line: 39, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 1165, + line: 39, + col: 23, + }, + }, + Name: "getLogger", + }, + keywords: [], + }, + }, + { '@type': "Delete", + '@token': "del", + '@role': [Incomplete, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1291, + line: 42, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1294, + line: 42, + col: 8, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1295, + line: 42, + col: 9, + }, + }, + ctx: "Del", + slice: { '@type': "Slice", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + lower: ~, + step: ~, + upper: ~, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1296, + line: 42, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 1302, + line: 42, + col: 16, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1295, + line: 42, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1301, + line: 42, + col: 15, + }, + }, + Name: "logger", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1295, + line: 42, + col: 9, + }, + }, + Name: "handlers", + }, + ], + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1318, + line: 43, + col: 5, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1319, + line: 43, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 1325, + line: 43, + col: 12, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1318, + line: 43, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1324, + line: 43, + col: 11, + }, + }, + Name: "logger", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1318, + line: 43, + col: 5, + }, + }, + Name: "__class__", + }, + ], + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1337, + line: 43, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 1348, + line: 43, + col: 35, + }, + }, + Name: "DebugLogger", + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1353, + line: 44, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1353, + line: 44, + col: 5, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1371, + line: 44, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 1378, + line: 44, + col: 30, + }, + }, + Name: "handler", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1354, + line: 44, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 1360, + line: 44, + col: 12, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1353, + line: 44, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1359, + line: 44, + col: 11, + }, + }, + Name: "logger", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1353, + line: 44, + col: 5, + }, + }, + Name: "addHandler", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1384, + line: 45, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1390, + line: 45, + col: 11, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1391, + line: 45, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 1397, + line: 45, + col: 18, + }, + }, + Name: "logger", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 349, + line: 17, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 352, + line: 17, + col: 22, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 349, + line: 17, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 352, + line: 17, + col: 22, + }, + }, + Name: "app", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_139_src.uast b/uast/diff/testdata/testcase_139_src.uast new file mode 100644 index 00000000..9ab45717 --- /dev/null +++ b/uast/diff/testdata/testcase_139_src.uast @@ -0,0 +1,1504 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 205, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 208, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n flask.logging\n ~~~~~~~~~~~~~\n\n Implements the logging support for Flask.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 210, + line: 12, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 225, + line: 12, + col: 16, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "absolute_import", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "__future__", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 250, + line: 14, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 262, + line: 14, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "getLogger", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "StreamHandler", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Formatter", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "getLoggerClass", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "DEBUG", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "logging", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 335, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 348, + line: 17, + col: 18, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "create_logger", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 670, + line: 23, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 359, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 677, + line: 23, + col: 8, + }, + }, + Format: "", + Value: "Creates a logger for the given application. This logger works\n similar to a regular Python logger but changes the effective logging\n level based on the application's debug flag. Furthermore this\n function also removes all attached handlers in case there was a\n logger with the log name before.\n ", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 682, + line: 24, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 682, + line: 24, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 688, + line: 24, + col: 11, + }, + }, + Name: "Logger", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 691, + line: 24, + col: 14, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 691, + line: 24, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 705, + line: 24, + col: 28, + }, + }, + Name: "getLoggerClass", + }, + keywords: [], + }, + }, + { '@type': "ClassDef", + '@token': "DebugLogger", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 719, + line: 26, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 730, + line: 26, + col: 22, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 731, + line: 26, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 737, + line: 26, + col: 29, + }, + }, + Name: "Logger", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 752, + line: 27, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 769, + line: 27, + col: 30, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "getEffectiveLevel", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 786, + line: 28, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 792, + line: 28, + col: 19, + }, + }, + value: { '@type': "IfExp", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 793, + line: 28, + col: 20, + }, + }, + body: { '@type': "uast:Identifier", + '@role': [Body, If, Then], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 793, + line: 28, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 798, + line: 28, + col: 25, + }, + }, + Name: "DEBUG", + }, + orelse: { '@type': "Call", + '@role': [Body, Call, Else, Expression, Function, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 817, + line: 28, + col: 44, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 842, + line: 28, + col: 69, + }, + end: { '@type': "uast:Position", + offset: 843, + line: 28, + col: 70, + }, + }, + Name: "x", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 818, + line: 28, + col: 45, + }, + end: { '@type': "uast:Position", + offset: 824, + line: 28, + col: 51, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 817, + line: 28, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 823, + line: 28, + col: 50, + }, + }, + Name: "Logger", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 817, + line: 28, + col: 44, + }, + }, + Name: "getEffectiveLevel", + }, + ], + }, + keywords: [], + }, + test: { '@type': "QualifiedIdentifier", + '@role': [Condition, Expression, Identifier, If, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 803, + line: 28, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 806, + line: 28, + col: 33, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 802, + line: 28, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 805, + line: 28, + col: 32, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 802, + line: 28, + col: 29, + }, + }, + Name: "debug", + }, + ], + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 770, + line: 27, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 771, + line: 27, + col: 32, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 770, + line: 27, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 771, + line: 27, + col: 32, + }, + }, + Name: "x", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "ClassDef", + '@token': "DebugHandler", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 856, + line: 30, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 868, + line: 30, + col: 23, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 869, + line: 30, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 882, + line: 30, + col: 37, + }, + }, + Name: "StreamHandler", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 897, + line: 31, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 901, + line: 31, + col: 17, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "emit", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 926, + line: 32, + col: 13, + }, + }, + value: { '@type': "IfExp", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 926, + line: 32, + col: 13, + }, + }, + body: { '@type': "Call", + '@role': [Body, Call, Expression, Function, If, Then], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 926, + line: 32, + col: 13, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 945, + line: 32, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 946, + line: 32, + col: 33, + }, + }, + Name: "x", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 948, + line: 32, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 954, + line: 32, + col: 41, + }, + }, + Name: "record", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 927, + line: 32, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 940, + line: 32, + col: 27, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 926, + line: 32, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 939, + line: 32, + col: 26, + }, + }, + Name: "StreamHandler", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 926, + line: 32, + col: 13, + }, + }, + Name: "emit", + }, + ], + }, + keywords: [], + }, + orelse: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Body, Else, Expression, If, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 974, + line: 32, + col: 61, + }, + end: { '@type': "uast:Position", + offset: 978, + line: 32, + col: 65, + }, + }, + LiteralValue: "None", + value: ~, + }, + test: { '@type': "QualifiedIdentifier", + '@role': [Condition, Expression, Identifier, If, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 960, + line: 32, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 963, + line: 32, + col: 50, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 959, + line: 32, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 962, + line: 32, + col: 49, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 959, + line: 32, + col: 46, + }, + }, + Name: "debug", + }, + ], + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 902, + line: 31, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 903, + line: 31, + col: 19, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 902, + line: 31, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 903, + line: 31, + col: 19, + }, + }, + Name: "x", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 905, + line: 31, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 911, + line: 31, + col: 27, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 905, + line: 31, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 911, + line: 31, + col: 27, + }, + }, + Name: "record", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 984, + line: 34, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 984, + line: 34, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 991, + line: 34, + col: 12, + }, + }, + Name: "handler", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 994, + line: 34, + col: 15, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 994, + line: 34, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 1006, + line: 34, + col: 27, + }, + }, + Name: "DebugHandler", + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1013, + line: 35, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1013, + line: 35, + col: 5, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1030, + line: 35, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 1035, + line: 35, + col: 27, + }, + }, + Name: "DEBUG", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1014, + line: 35, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 1021, + line: 35, + col: 13, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1013, + line: 35, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1020, + line: 35, + col: 12, + }, + }, + Name: "handler", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1013, + line: 35, + col: 5, + }, + }, + Name: "setLevel", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1041, + line: 36, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1041, + line: 36, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1062, + line: 36, + col: 26, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1073, + line: 36, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 1076, + line: 36, + col: 40, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1072, + line: 36, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 1075, + line: 36, + col: 39, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1072, + line: 36, + col: 36, + }, + }, + Name: "debug_log_format", + }, + ], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1062, + line: 36, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 1071, + line: 36, + col: 35, + }, + }, + Name: "Formatter", + }, + keywords: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1042, + line: 36, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 1049, + line: 36, + col: 13, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1041, + line: 36, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1048, + line: 36, + col: 12, + }, + }, + Name: "handler", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1041, + line: 36, + col: 5, + }, + }, + Name: "setFormatter", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1099, + line: 37, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1099, + line: 37, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1105, + line: 37, + col: 11, + }, + }, + Name: "logger", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1108, + line: 37, + col: 14, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1119, + line: 37, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 1122, + line: 37, + col: 28, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1118, + line: 37, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 1121, + line: 37, + col: 27, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1118, + line: 37, + col: 24, + }, + }, + Name: "logger_name", + }, + ], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1108, + line: 37, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 1117, + line: 37, + col: 23, + }, + }, + Name: "getLogger", + }, + keywords: [], + }, + }, + { '@type': "Delete", + '@token': "del", + '@role': [Incomplete, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1243, + line: 40, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1246, + line: 40, + col: 8, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1247, + line: 40, + col: 9, + }, + }, + ctx: "Del", + slice: { '@type': "Slice", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + lower: ~, + step: ~, + upper: ~, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1248, + line: 40, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 1254, + line: 40, + col: 16, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1247, + line: 40, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1253, + line: 40, + col: 15, + }, + }, + Name: "logger", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1247, + line: 40, + col: 9, + }, + }, + Name: "handlers", + }, + ], + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1270, + line: 41, + col: 5, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1271, + line: 41, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 1277, + line: 41, + col: 12, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1270, + line: 41, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1276, + line: 41, + col: 11, + }, + }, + Name: "logger", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1270, + line: 41, + col: 5, + }, + }, + Name: "__class__", + }, + ], + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1289, + line: 41, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 1300, + line: 41, + col: 35, + }, + }, + Name: "DebugLogger", + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1305, + line: 42, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1305, + line: 42, + col: 5, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1323, + line: 42, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 1330, + line: 42, + col: 30, + }, + }, + Name: "handler", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1306, + line: 42, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 1312, + line: 42, + col: 12, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1305, + line: 42, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1311, + line: 42, + col: 11, + }, + }, + Name: "logger", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1305, + line: 42, + col: 5, + }, + }, + Name: "addHandler", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1336, + line: 43, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1342, + line: 43, + col: 11, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1343, + line: 43, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 1349, + line: 43, + col: 18, + }, + }, + Name: "logger", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 349, + line: 17, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 352, + line: 17, + col: 22, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 349, + line: 17, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 352, + line: 17, + col: 22, + }, + }, + Name: "app", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_13_dst.uast b/uast/diff/testdata/testcase_13_dst.uast new file mode 100644 index 00000000..dcea5f8e --- /dev/null +++ b/uast/diff/testdata/testcase_13_dst.uast @@ -0,0 +1,323 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 10, + line: 1, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "simple_page", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "simple_page.simple_page", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 73, + line: 4, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 73, + line: 4, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 76, + line: 4, + col: 4, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 79, + line: 4, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 85, + line: 4, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 93, + line: 4, + col: 21, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 79, + line: 4, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 84, + line: 4, + col: 12, + }, + }, + Name: "Flask", + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 95, + line: 5, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 95, + line: 5, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 118, + line: 5, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 129, + line: 5, + col: 35, + }, + }, + Name: "simple_page", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 96, + line: 5, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 99, + line: 5, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 95, + line: 5, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 98, + line: 5, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 95, + line: 5, + col: 1, + }, + }, + Name: "register_blueprint", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 172, + line: 7, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 172, + line: 7, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 195, + line: 7, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 206, + line: 7, + col: 35, + }, + }, + Name: "simple_page", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 173, + line: 7, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 176, + line: 7, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 172, + line: 7, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 175, + line: 7, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 172, + line: 7, + col: 1, + }, + }, + Name: "register_blueprint", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "url_prefix", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 219, + line: 7, + col: 48, + }, + end: { '@type': "uast:Position", + offset: 227, + line: 7, + col: 56, + }, + }, + Format: "", + Value: "/pages", + }, + }, + ], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_13_src.uast b/uast/diff/testdata/testcase_13_src.uast new file mode 100644 index 00000000..58ffeb04 --- /dev/null +++ b/uast/diff/testdata/testcase_13_src.uast @@ -0,0 +1,498 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 10, + line: 1, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "simple_page", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "simple_page.simple_page", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 73, + line: 4, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 73, + line: 4, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 76, + line: 4, + col: 4, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 79, + line: 4, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 85, + line: 4, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 93, + line: 4, + col: 21, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 79, + line: 4, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 84, + line: 4, + col: 12, + }, + }, + Name: "Flask", + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 95, + line: 5, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 95, + line: 5, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 118, + line: 5, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 129, + line: 5, + col: 35, + }, + }, + Name: "simple_page", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 96, + line: 5, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 99, + line: 5, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 95, + line: 5, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 98, + line: 5, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 95, + line: 5, + col: 1, + }, + }, + Name: "register_blueprint", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 172, + line: 7, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 172, + line: 7, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 195, + line: 7, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 206, + line: 7, + col: 35, + }, + }, + Name: "simple_page", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 173, + line: 7, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 176, + line: 7, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 172, + line: 7, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 175, + line: 7, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 172, + line: 7, + col: 1, + }, + }, + Name: "register_blueprint", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "url_prefix", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 219, + line: 7, + col: 48, + }, + end: { '@type': "uast:Position", + offset: 227, + line: 7, + col: 56, + }, + }, + Format: "", + Value: "/pages", + }, + }, + ], + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 232, + line: 10, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 234, + line: 10, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 263, + line: 11, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 263, + line: 11, + col: 5, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 264, + line: 11, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 267, + line: 11, + col: 9, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 263, + line: 11, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 266, + line: 11, + col: 8, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 263, + line: 11, + col: 5, + }, + }, + Name: "run", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "debug", + }, + value: { '@type': "BoolLiteral", + '@token': "True", + '@role': [Argument, Boolean, Expression, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 277, + line: 11, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 281, + line: 11, + col: 23, + }, + }, + value: true, + }, + }, + ], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 235, + line: 10, + col: 4, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 247, + line: 10, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 257, + line: 10, + col: 26, + }, + }, + Format: "", + Value: "__main__", + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 235, + line: 10, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 243, + line: 10, + col: 12, + }, + }, + Name: "__name__", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_140_dst.uast b/uast/diff/testdata/testcase_140_dst.uast new file mode 100644 index 00000000..645ba4aa --- /dev/null +++ b/uast/diff/testdata/testcase_140_dst.uast @@ -0,0 +1,718 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 13, + col: 12, + }, + }, + Name: "__version__", + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 13, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 280, + line: 13, + col: 24, + }, + }, + Format: "", + Value: "0.9-dev", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 399, + line: 17, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.exceptions", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 437, + line: 18, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.utils", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 473, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 484, + line: 19, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 508, + line: 21, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 517, + line: 21, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 550, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 562, + line: 22, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 577, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 590, + line: 23, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 754, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 767, + line: 26, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_app_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 851, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 860, + line: 28, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_app_context", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "after_this_request", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 932, + line: 30, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 944, + line: 30, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 959, + line: 31, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 975, + line: 31, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 993, + line: 32, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1009, + line: 32, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1072, + line: 35, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1085, + line: 35, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1255, + line: 39, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1257, + line: 39, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1278, + line: 40, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1291, + line: 40, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1258, + line: 39, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1272, + line: 39, + col: 18, + }, + }, + Name: "json_available", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1342, + line: 43, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1356, + line: 43, + col: 15, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "SecureCookieSession", + }, + Node: { '@type': "uast:Identifier", + Name: "Session", + }, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../sessions", + }, + Target: ~, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_140_src.uast b/uast/diff/testdata/testcase_140_src.uast new file mode 100644 index 00000000..6df82b85 --- /dev/null +++ b/uast/diff/testdata/testcase_140_src.uast @@ -0,0 +1,710 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 13, + col: 12, + }, + }, + Name: "__version__", + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 13, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 280, + line: 13, + col: 24, + }, + }, + Format: "", + Value: "0.9-dev", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 399, + line: 17, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.exceptions", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 437, + line: 18, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.utils", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 473, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 484, + line: 19, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 508, + line: 21, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 517, + line: 21, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 550, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 562, + line: 22, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 577, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 590, + line: 23, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 754, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 767, + line: 26, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_app_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 851, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 860, + line: 28, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_app_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 905, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 917, + line: 29, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 932, + line: 30, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 948, + line: 30, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 966, + line: 31, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 982, + line: 31, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1045, + line: 34, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1058, + line: 34, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1228, + line: 38, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1230, + line: 38, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1251, + line: 39, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1264, + line: 39, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1231, + line: 38, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1245, + line: 38, + col: 18, + }, + }, + Name: "json_available", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1315, + line: 42, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1329, + line: 42, + col: 15, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "SecureCookieSession", + }, + Node: { '@type': "uast:Identifier", + Name: "Session", + }, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../sessions", + }, + Target: ~, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_141_dst.uast b/uast/diff/testdata/testcase_141_dst.uast new file mode 100644 index 00000000..c96e0853 --- /dev/null +++ b/uast/diff/testdata/testcase_141_dst.uast @@ -0,0 +1,726 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 13, + col: 12, + }, + }, + Name: "__version__", + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 13, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 280, + line: 13, + col: 24, + }, + }, + Format: "", + Value: "0.9-dev", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 399, + line: 17, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.exceptions", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 437, + line: 18, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.utils", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 473, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 484, + line: 19, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 508, + line: 21, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 517, + line: 21, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 550, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 562, + line: 22, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 577, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 590, + line: 23, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "stream_with_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 781, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 794, + line: 27, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_app_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 878, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 887, + line: 29, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_app_context", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "after_this_request", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 959, + line: 31, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 971, + line: 31, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 986, + line: 32, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1002, + line: 32, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1020, + line: 33, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1036, + line: 33, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1099, + line: 36, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1112, + line: 36, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1282, + line: 40, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1284, + line: 40, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1305, + line: 41, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1318, + line: 41, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1285, + line: 40, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1299, + line: 40, + col: 18, + }, + }, + Name: "json_available", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1369, + line: 44, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1383, + line: 44, + col: 15, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "SecureCookieSession", + }, + Node: { '@type': "uast:Identifier", + Name: "Session", + }, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../sessions", + }, + Target: ~, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_141_src.uast b/uast/diff/testdata/testcase_141_src.uast new file mode 100644 index 00000000..645ba4aa --- /dev/null +++ b/uast/diff/testdata/testcase_141_src.uast @@ -0,0 +1,718 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 13, + col: 12, + }, + }, + Name: "__version__", + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 13, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 280, + line: 13, + col: 24, + }, + }, + Format: "", + Value: "0.9-dev", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 399, + line: 17, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.exceptions", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 437, + line: 18, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.utils", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 473, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 484, + line: 19, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 508, + line: 21, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 517, + line: 21, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 550, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 562, + line: 22, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 577, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 590, + line: 23, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 754, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 767, + line: 26, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_app_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 851, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 860, + line: 28, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_app_context", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "after_this_request", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 932, + line: 30, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 944, + line: 30, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 959, + line: 31, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 975, + line: 31, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 993, + line: 32, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1009, + line: 32, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1072, + line: 35, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1085, + line: 35, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1255, + line: 39, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1257, + line: 39, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1278, + line: 40, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1291, + line: 40, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1258, + line: 39, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1272, + line: 39, + col: 18, + }, + }, + Name: "json_available", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1342, + line: 43, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1356, + line: 43, + col: 15, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "SecureCookieSession", + }, + Node: { '@type': "uast:Identifier", + Name: "Session", + }, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../sessions", + }, + Target: ~, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_142_dst.uast b/uast/diff/testdata/testcase_142_dst.uast new file mode 100644 index 00000000..bb327f7d --- /dev/null +++ b/uast/diff/testdata/testcase_142_dst.uast @@ -0,0 +1,1681 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 246, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 249, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask.globals\n ~~~~~~~~~~~~~\n\n Defines all the global objects that are proxies to the current\n active context.\n\n :copyright: (c) 2014 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 251, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 265, + line: 13, + col: 15, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "partial", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "functools", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 281, + line: 14, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "LocalStack", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "LocalProxy", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.local", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 337, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 355, + line: 17, + col: 23, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_lookup_req_object", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 367, + line: 18, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 367, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 370, + line: 18, + col: 8, + }, + }, + Name: "top", + }, + ], + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 18, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 392, + line: 18, + col: 30, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 373, + line: 18, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 391, + line: 18, + col: 29, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 373, + line: 18, + col: 11, + }, + }, + Name: "top", + }, + ], + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 400, + line: 19, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 402, + line: 19, + col: 7, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Raise", + '@token': "raise", + '@role': [Statement, Throw], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 424, + line: 20, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 429, + line: 20, + col: 14, + }, + }, + cause: ~, + exc: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 430, + line: 20, + col: 15, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 443, + line: 20, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 479, + line: 20, + col: 64, + }, + }, + Format: "", + Value: "working outside of request context", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 430, + line: 20, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 442, + line: 20, + col: 27, + }, + }, + Name: "RuntimeError", + }, + keywords: [], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 403, + line: 19, + col: 8, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 410, + line: 19, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 414, + line: 19, + col: 19, + }, + }, + LiteralValue: "None", + value: ~, + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 403, + line: 19, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 406, + line: 19, + col: 11, + }, + }, + Name: "top", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Is", + '@token': "is", + '@role': [Identical, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 485, + line: 21, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 491, + line: 21, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 492, + line: 21, + col: 12, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 500, + line: 21, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 503, + line: 21, + col: 23, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 505, + line: 21, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 509, + line: 21, + col: 29, + }, + }, + Name: "name", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 492, + line: 21, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 499, + line: 21, + col: 19, + }, + }, + Name: "getattr", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 356, + line: 17, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 360, + line: 17, + col: 28, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 356, + line: 17, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 360, + line: 17, + col: 28, + }, + }, + Name: "name", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 517, + line: 24, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 535, + line: 24, + col: 23, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_lookup_app_object", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 547, + line: 25, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 547, + line: 25, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 550, + line: 25, + col: 8, + }, + }, + Name: "top", + }, + ], + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 554, + line: 25, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 568, + line: 25, + col: 26, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 553, + line: 25, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 567, + line: 25, + col: 25, + }, + }, + Name: "_app_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 553, + line: 25, + col: 11, + }, + }, + Name: "top", + }, + ], + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 576, + line: 26, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 578, + line: 26, + col: 7, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Raise", + '@token': "raise", + '@role': [Statement, Throw], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 600, + line: 27, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 605, + line: 27, + col: 14, + }, + }, + cause: ~, + exc: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 606, + line: 27, + col: 15, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 619, + line: 27, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 659, + line: 27, + col: 68, + }, + }, + Format: "", + Value: "working outside of application context", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 606, + line: 27, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 618, + line: 27, + col: 27, + }, + }, + Name: "RuntimeError", + }, + keywords: [], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 579, + line: 26, + col: 8, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 586, + line: 26, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 590, + line: 26, + col: 19, + }, + }, + LiteralValue: "None", + value: ~, + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 579, + line: 26, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 582, + line: 26, + col: 11, + }, + }, + Name: "top", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Is", + '@token': "is", + '@role': [Identical, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 665, + line: 28, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 671, + line: 28, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 672, + line: 28, + col: 12, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 680, + line: 28, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 683, + line: 28, + col: 23, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 685, + line: 28, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 689, + line: 28, + col: 29, + }, + }, + Name: "name", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 672, + line: 28, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 679, + line: 28, + col: 19, + }, + }, + Name: "getattr", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 536, + line: 24, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 540, + line: 24, + col: 28, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 536, + line: 24, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 540, + line: 24, + col: 28, + }, + }, + Name: "name", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 697, + line: 31, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 706, + line: 31, + col: 14, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_find_app", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 714, + line: 32, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 714, + line: 32, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 717, + line: 32, + col: 8, + }, + }, + Name: "top", + }, + ], + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 721, + line: 32, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 735, + line: 32, + col: 26, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 720, + line: 32, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 734, + line: 32, + col: 25, + }, + }, + Name: "_app_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 720, + line: 32, + col: 11, + }, + }, + Name: "top", + }, + ], + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 743, + line: 33, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 745, + line: 33, + col: 7, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Raise", + '@token': "raise", + '@role': [Statement, Throw], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 767, + line: 34, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 772, + line: 34, + col: 14, + }, + }, + cause: ~, + exc: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 773, + line: 34, + col: 15, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 786, + line: 34, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 826, + line: 34, + col: 68, + }, + }, + Format: "", + Value: "working outside of application context", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 773, + line: 34, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 785, + line: 34, + col: 27, + }, + }, + Name: "RuntimeError", + }, + keywords: [], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 746, + line: 33, + col: 8, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 753, + line: 33, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 757, + line: 33, + col: 19, + }, + }, + LiteralValue: "None", + value: ~, + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 746, + line: 33, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 749, + line: 33, + col: 11, + }, + }, + Name: "top", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Is", + '@token': "is", + '@role': [Identical, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 832, + line: 35, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 838, + line: 35, + col: 11, + }, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 840, + line: 35, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 843, + line: 35, + col: 16, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 839, + line: 35, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 842, + line: 35, + col: 15, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 839, + line: 35, + col: 12, + }, + }, + Name: "app", + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 866, + line: 39, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 866, + line: 39, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 884, + line: 39, + col: 19, + }, + }, + Name: "_request_ctx_stack", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 887, + line: 39, + col: 22, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 887, + line: 39, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 897, + line: 39, + col: 32, + }, + }, + Name: "LocalStack", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 900, + line: 40, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 900, + line: 40, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 914, + line: 40, + col: 15, + }, + }, + Name: "_app_ctx_stack", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 917, + line: 40, + col: 18, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 917, + line: 40, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 927, + line: 40, + col: 28, + }, + }, + Name: "LocalStack", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 930, + line: 41, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 930, + line: 41, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 941, + line: 41, + col: 12, + }, + }, + Name: "current_app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 944, + line: 41, + col: 15, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 955, + line: 41, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 964, + line: 41, + col: 35, + }, + }, + Name: "_find_app", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 944, + line: 41, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 954, + line: 41, + col: 25, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 966, + line: 42, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 966, + line: 42, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 973, + line: 42, + col: 8, + }, + }, + Name: "request", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 976, + line: 42, + col: 11, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 987, + line: 42, + col: 22, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 995, + line: 42, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 1013, + line: 42, + col: 48, + }, + }, + Name: "_lookup_req_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1015, + line: 42, + col: 50, + }, + end: { '@type': "uast:Position", + offset: 1024, + line: 42, + col: 59, + }, + }, + Format: "", + Value: "request", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 987, + line: 42, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 994, + line: 42, + col: 29, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 976, + line: 42, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 986, + line: 42, + col: 21, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1027, + line: 43, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1027, + line: 43, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1034, + line: 43, + col: 8, + }, + }, + Name: "session", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1037, + line: 43, + col: 11, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1048, + line: 43, + col: 22, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1056, + line: 43, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 1074, + line: 43, + col: 48, + }, + }, + Name: "_lookup_req_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1076, + line: 43, + col: 50, + }, + end: { '@type': "uast:Position", + offset: 1085, + line: 43, + col: 59, + }, + }, + Format: "", + Value: "session", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1048, + line: 43, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 1055, + line: 43, + col: 29, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1037, + line: 43, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 1047, + line: 43, + col: 21, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1088, + line: 44, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1088, + line: 44, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1089, + line: 44, + col: 2, + }, + }, + Name: "g", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1092, + line: 44, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1103, + line: 44, + col: 16, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1111, + line: 44, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 1129, + line: 44, + col: 42, + }, + }, + Name: "_lookup_app_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1131, + line: 44, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 1134, + line: 44, + col: 47, + }, + }, + Format: "", + Value: "g", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1103, + line: 44, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 1110, + line: 44, + col: 23, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1092, + line: 44, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1102, + line: 44, + col: 15, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_142_src.uast b/uast/diff/testdata/testcase_142_src.uast new file mode 100644 index 00000000..00bde417 --- /dev/null +++ b/uast/diff/testdata/testcase_142_src.uast @@ -0,0 +1,1681 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 246, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 249, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask.globals\n ~~~~~~~~~~~~~\n\n Defines all the global objects that are proxies to the current\n active context.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 251, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 265, + line: 13, + col: 15, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "partial", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "functools", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 281, + line: 14, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "LocalStack", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "LocalProxy", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.local", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 337, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 355, + line: 17, + col: 23, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_lookup_req_object", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 367, + line: 18, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 367, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 370, + line: 18, + col: 8, + }, + }, + Name: "top", + }, + ], + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 18, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 392, + line: 18, + col: 30, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 373, + line: 18, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 391, + line: 18, + col: 29, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 373, + line: 18, + col: 11, + }, + }, + Name: "top", + }, + ], + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 400, + line: 19, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 402, + line: 19, + col: 7, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Raise", + '@token': "raise", + '@role': [Statement, Throw], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 424, + line: 20, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 429, + line: 20, + col: 14, + }, + }, + cause: ~, + exc: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 430, + line: 20, + col: 15, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 443, + line: 20, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 479, + line: 20, + col: 64, + }, + }, + Format: "", + Value: "working outside of request context", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 430, + line: 20, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 442, + line: 20, + col: 27, + }, + }, + Name: "RuntimeError", + }, + keywords: [], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 403, + line: 19, + col: 8, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 410, + line: 19, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 414, + line: 19, + col: 19, + }, + }, + LiteralValue: "None", + value: ~, + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 403, + line: 19, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 406, + line: 19, + col: 11, + }, + }, + Name: "top", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Is", + '@token': "is", + '@role': [Identical, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 485, + line: 21, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 491, + line: 21, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 492, + line: 21, + col: 12, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 500, + line: 21, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 503, + line: 21, + col: 23, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 505, + line: 21, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 509, + line: 21, + col: 29, + }, + }, + Name: "name", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 492, + line: 21, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 499, + line: 21, + col: 19, + }, + }, + Name: "getattr", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 356, + line: 17, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 360, + line: 17, + col: 28, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 356, + line: 17, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 360, + line: 17, + col: 28, + }, + }, + Name: "name", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 517, + line: 24, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 535, + line: 24, + col: 23, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_lookup_app_object", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 547, + line: 25, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 547, + line: 25, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 550, + line: 25, + col: 8, + }, + }, + Name: "top", + }, + ], + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 554, + line: 25, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 568, + line: 25, + col: 26, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 553, + line: 25, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 567, + line: 25, + col: 25, + }, + }, + Name: "_app_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 553, + line: 25, + col: 11, + }, + }, + Name: "top", + }, + ], + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 576, + line: 26, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 578, + line: 26, + col: 7, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Raise", + '@token': "raise", + '@role': [Statement, Throw], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 600, + line: 27, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 605, + line: 27, + col: 14, + }, + }, + cause: ~, + exc: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 606, + line: 27, + col: 15, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 619, + line: 27, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 659, + line: 27, + col: 68, + }, + }, + Format: "", + Value: "working outside of application context", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 606, + line: 27, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 618, + line: 27, + col: 27, + }, + }, + Name: "RuntimeError", + }, + keywords: [], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 579, + line: 26, + col: 8, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 586, + line: 26, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 590, + line: 26, + col: 19, + }, + }, + LiteralValue: "None", + value: ~, + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 579, + line: 26, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 582, + line: 26, + col: 11, + }, + }, + Name: "top", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Is", + '@token': "is", + '@role': [Identical, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 665, + line: 28, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 671, + line: 28, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 672, + line: 28, + col: 12, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 680, + line: 28, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 683, + line: 28, + col: 23, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 685, + line: 28, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 689, + line: 28, + col: 29, + }, + }, + Name: "name", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 672, + line: 28, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 679, + line: 28, + col: 19, + }, + }, + Name: "getattr", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 536, + line: 24, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 540, + line: 24, + col: 28, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 536, + line: 24, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 540, + line: 24, + col: 28, + }, + }, + Name: "name", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 697, + line: 31, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 706, + line: 31, + col: 14, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_find_app", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 714, + line: 32, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 714, + line: 32, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 717, + line: 32, + col: 8, + }, + }, + Name: "top", + }, + ], + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 721, + line: 32, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 735, + line: 32, + col: 26, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 720, + line: 32, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 734, + line: 32, + col: 25, + }, + }, + Name: "_app_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 720, + line: 32, + col: 11, + }, + }, + Name: "top", + }, + ], + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 743, + line: 33, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 745, + line: 33, + col: 7, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Raise", + '@token': "raise", + '@role': [Statement, Throw], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 767, + line: 34, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 772, + line: 34, + col: 14, + }, + }, + cause: ~, + exc: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 773, + line: 34, + col: 15, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 786, + line: 34, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 826, + line: 34, + col: 68, + }, + }, + Format: "", + Value: "working outside of application context", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 773, + line: 34, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 785, + line: 34, + col: 27, + }, + }, + Name: "RuntimeError", + }, + keywords: [], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 746, + line: 33, + col: 8, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 753, + line: 33, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 757, + line: 33, + col: 19, + }, + }, + LiteralValue: "None", + value: ~, + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 746, + line: 33, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 749, + line: 33, + col: 11, + }, + }, + Name: "top", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Is", + '@token': "is", + '@role': [Identical, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 832, + line: 35, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 838, + line: 35, + col: 11, + }, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 840, + line: 35, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 843, + line: 35, + col: 16, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 839, + line: 35, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 842, + line: 35, + col: 15, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 839, + line: 35, + col: 12, + }, + }, + Name: "app", + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 866, + line: 39, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 866, + line: 39, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 884, + line: 39, + col: 19, + }, + }, + Name: "_request_ctx_stack", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 887, + line: 39, + col: 22, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 887, + line: 39, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 897, + line: 39, + col: 32, + }, + }, + Name: "LocalStack", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 900, + line: 40, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 900, + line: 40, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 914, + line: 40, + col: 15, + }, + }, + Name: "_app_ctx_stack", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 917, + line: 40, + col: 18, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 917, + line: 40, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 927, + line: 40, + col: 28, + }, + }, + Name: "LocalStack", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 930, + line: 41, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 930, + line: 41, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 941, + line: 41, + col: 12, + }, + }, + Name: "current_app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 944, + line: 41, + col: 15, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 955, + line: 41, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 964, + line: 41, + col: 35, + }, + }, + Name: "_find_app", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 944, + line: 41, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 954, + line: 41, + col: 25, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 966, + line: 42, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 966, + line: 42, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 973, + line: 42, + col: 8, + }, + }, + Name: "request", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 976, + line: 42, + col: 11, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 987, + line: 42, + col: 22, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 995, + line: 42, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 1013, + line: 42, + col: 48, + }, + }, + Name: "_lookup_req_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1015, + line: 42, + col: 50, + }, + end: { '@type': "uast:Position", + offset: 1024, + line: 42, + col: 59, + }, + }, + Format: "", + Value: "request", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 987, + line: 42, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 994, + line: 42, + col: 29, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 976, + line: 42, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 986, + line: 42, + col: 21, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1027, + line: 43, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1027, + line: 43, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1034, + line: 43, + col: 8, + }, + }, + Name: "session", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1037, + line: 43, + col: 11, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1048, + line: 43, + col: 22, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1056, + line: 43, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 1074, + line: 43, + col: 48, + }, + }, + Name: "_lookup_req_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1076, + line: 43, + col: 50, + }, + end: { '@type': "uast:Position", + offset: 1085, + line: 43, + col: 59, + }, + }, + Format: "", + Value: "session", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1048, + line: 43, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 1055, + line: 43, + col: 29, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1037, + line: 43, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 1047, + line: 43, + col: 21, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1088, + line: 44, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1088, + line: 44, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1089, + line: 44, + col: 2, + }, + }, + Name: "g", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1092, + line: 44, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1103, + line: 44, + col: 16, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1111, + line: 44, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 1129, + line: 44, + col: 42, + }, + }, + Name: "_lookup_app_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1131, + line: 44, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 1134, + line: 44, + col: 47, + }, + }, + Format: "", + Value: "g", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1103, + line: 44, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 1110, + line: 44, + col: 23, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1092, + line: 44, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1102, + line: 44, + col: 15, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_143_dst.uast b/uast/diff/testdata/testcase_143_dst.uast new file mode 100644 index 00000000..b8137c85 --- /dev/null +++ b/uast/diff/testdata/testcase_143_dst.uast @@ -0,0 +1,1673 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 281, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 284, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask.testing\n ~~~~~~~~~~~~~\n\n Implements test support helpers. This module is lazily imported\n and usually not used in production environments.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 285, + line: 12, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 298, + line: 12, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Client", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 313, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 323, + line: 13, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "ClassDef", + '@token': "FlaskClient", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 358, + line: 16, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 369, + line: 16, + col: 18, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 370, + line: 16, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 376, + line: 16, + col: 25, + }, + }, + Name: "Client", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 592, + line: 21, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 383, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 599, + line: 21, + col: 8, + }, + }, + Format: "", + Value: "Works like a regular Werkzeug test client but has some\n knowledge about how Flask works to defer the cleanup of the\n request context stack to the end of a with body when used\n in a with statement.\n ", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 605, + line: 23, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 605, + line: 23, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 621, + line: 23, + col: 21, + }, + }, + Name: "preserve_context", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 624, + line: 23, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 641, + line: 23, + col: 41, + }, + }, + Name: "context_preserved", + }, + ], + value: { '@type': "BoolLiteral", + '@token': "False", + '@role': [Boolean, Expression, Literal, Primitive, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 644, + line: 23, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 649, + line: 23, + col: 49, + }, + }, + value: false, + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 659, + line: 25, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 663, + line: 25, + col: 13, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "open", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 696, + line: 26, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 698, + line: 26, + col: 11, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 735, + line: 27, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 735, + line: 27, + col: 13, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 736, + line: 27, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 754, + line: 27, + col: 32, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 735, + line: 27, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 753, + line: 27, + col: 31, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 735, + line: 27, + col: 13, + }, + }, + Name: "pop", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 772, + line: 28, + col: 13, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 773, + line: 28, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 777, + line: 28, + col: 18, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 772, + line: 28, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 776, + line: 28, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 772, + line: 28, + col: 13, + }, + }, + Name: "context_preserved", + }, + ], + }, + ], + value: { '@type': "BoolLiteral", + '@token': "False", + '@role': [Boolean, Expression, Literal, Primitive, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 797, + line: 28, + col: 38, + }, + end: { '@type': "uast:Position", + offset: 802, + line: 28, + col: 43, + }, + }, + value: false, + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "QualifiedIdentifier", + '@role': [Condition, Expression, Identifier, If, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 700, + line: 26, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 704, + line: 26, + col: 17, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 699, + line: 26, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 703, + line: 26, + col: 16, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 699, + line: 26, + col: 12, + }, + }, + Name: "context_preserved", + }, + ], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 811, + line: 29, + col: 9, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 811, + line: 29, + col: 9, + }, + }, + ctx: "Store", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 869, + line: 30, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 894, + line: 30, + col: 39, + }, + }, + Format: "", + Value: "flask._preserve_context", + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 811, + line: 29, + col: 9, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 829, + line: 29, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 848, + line: 29, + col: 46, + }, + }, + Format: "", + Value: "environ_overrides", + }, + { '@type': "Dict", + '@role': [Argument, Call, Expression, Function, Literal, Map, Name, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 850, + line: 29, + col: 48, + }, + }, + keys: [], + values: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 812, + line: 29, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 818, + line: 29, + col: 16, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 811, + line: 29, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 817, + line: 29, + col: 15, + }, + }, + Name: "kwargs", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 811, + line: 29, + col: 9, + }, + }, + Name: "setdefault", + }, + ], + }, + keywords: [], + }, + }, + ], + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 899, + line: 30, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 903, + line: 30, + col: 48, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 898, + line: 30, + col: 43, + }, + end: { '@type': "uast:Position", + offset: 902, + line: 30, + col: 47, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 898, + line: 30, + col: 43, + }, + }, + Name: "preserve_context", + }, + ], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 928, + line: 31, + col: 9, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 928, + line: 31, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 931, + line: 31, + col: 12, + }, + }, + Name: "old", + }, + ], + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 935, + line: 31, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 953, + line: 31, + col: 34, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 934, + line: 31, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 952, + line: 31, + col: 33, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 934, + line: 31, + col: 15, + }, + }, + Name: "top", + }, + ], + }, + }, + { '@type': "Try", + '@token': "try", + '@role': [Statement, Try], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 965, + line: 32, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 968, + line: 32, + col: 12, + }, + }, + body: { '@type': "Try.body", + '@role': [Body, Try], + 'body_stmts': [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 982, + line: 33, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 988, + line: 33, + col: 19, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 989, + line: 33, + col: 20, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1001, + line: 33, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 1005, + line: 33, + col: 36, + }, + }, + Name: "self", + }, + { '@type': "Starred", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1007, + line: 33, + col: 38, + }, + }, + ctx: "Load", + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1008, + line: 33, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 1012, + line: 33, + col: 43, + }, + }, + Name: "args", + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 990, + line: 33, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 996, + line: 33, + col: 27, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 989, + line: 33, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 995, + line: 33, + col: 26, + }, + }, + Name: "Client", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 989, + line: 33, + col: 20, + }, + }, + Name: "open", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: ~, + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1016, + line: 33, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 1022, + line: 33, + col: 53, + }, + }, + Name: "kwargs", + }, + }, + ], + }, + }, + ], + }, + finalbody: { '@type': "Try.finalbody", + '@token': "finally", + '@role': [Finally, Try], + 'final_stmts': [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1053, + line: 35, + col: 13, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1054, + line: 35, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 1058, + line: 35, + col: 18, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1053, + line: 35, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1057, + line: 35, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1053, + line: 35, + col: 13, + }, + }, + Name: "context_preserved", + }, + ], + }, + ], + value: { '@type': "Compare", + '@role': [Binary, Condition, Expression, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1078, + line: 35, + col: 38, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1108, + line: 35, + col: 68, + }, + end: { '@type': "uast:Position", + offset: 1111, + line: 35, + col: 71, + }, + }, + Name: "old", + }, + ], + }, + left: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1079, + line: 35, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 1097, + line: 35, + col: 57, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1078, + line: 35, + col: 38, + }, + end: { '@type': "uast:Position", + offset: 1096, + line: 35, + col: 56, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1078, + line: 35, + col: 38, + }, + }, + Name: "top", + }, + ], + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "IsNot", + '@token': "is not", + '@role': [Identical, Not, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + ], + }, + handlers: { '@type': "Try.handlers", + '@token': "except", + '@role': [Catch, Try], + handlers: [], + }, + orelse: { '@type': "Try.else", + '@token': "else", + '@role': [Else, Try], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 664, + line: 25, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 668, + line: 25, + col: 18, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 664, + line: 25, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 668, + line: 25, + col: 18, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 679, + line: 25, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 685, + line: 25, + col: 35, + }, + }, + Init: ~, + MapVariadic: true, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 679, + line: 25, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 685, + line: 25, + col: 35, + }, + }, + Name: "kwargs", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 671, + line: 25, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 675, + line: 25, + col: 25, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 671, + line: 25, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 675, + line: 25, + col: 25, + }, + }, + Name: "args", + }, + Receiver: false, + Type: ~, + Variadic: true, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1121, + line: 37, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1130, + line: 37, + col: 18, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "__enter__", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1146, + line: 38, + col: 9, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1147, + line: 38, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 1151, + line: 38, + col: 14, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1146, + line: 38, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1150, + line: 38, + col: 13, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1146, + line: 38, + col: 9, + }, + }, + Name: "preserve_context", + }, + ], + }, + ], + value: { '@type': "BoolLiteral", + '@token': "True", + '@role': [Boolean, Expression, Literal, Primitive, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1170, + line: 38, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 1174, + line: 38, + col: 37, + }, + }, + value: true, + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1183, + line: 39, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1189, + line: 39, + col: 15, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1190, + line: 39, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 1194, + line: 39, + col: 20, + }, + }, + Name: "self", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1131, + line: 37, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 1135, + line: 37, + col: 23, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1131, + line: 37, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 1135, + line: 37, + col: 23, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1204, + line: 41, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1212, + line: 41, + col: 17, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "__exit__", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1253, + line: 42, + col: 9, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1254, + line: 42, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 1258, + line: 42, + col: 14, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1253, + line: 42, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1257, + line: 42, + col: 13, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1253, + line: 42, + col: 9, + }, + }, + Name: "preserve_context", + }, + ], + }, + ], + value: { '@type': "BoolLiteral", + '@token': "False", + '@role': [Boolean, Expression, Literal, Primitive, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1277, + line: 42, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 1282, + line: 42, + col: 38, + }, + }, + value: false, + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1291, + line: 43, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1293, + line: 43, + col: 11, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1330, + line: 44, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1330, + line: 44, + col: 13, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1331, + line: 44, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 1349, + line: 44, + col: 32, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1330, + line: 44, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1348, + line: 44, + col: 31, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1330, + line: 44, + col: 13, + }, + }, + Name: "pop", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "QualifiedIdentifier", + '@role': [Condition, Expression, Identifier, If, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1295, + line: 43, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1299, + line: 43, + col: 17, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1294, + line: 43, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 1298, + line: 43, + col: 16, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1294, + line: 43, + col: 12, + }, + }, + Name: "context_preserved", + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1213, + line: 41, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 1217, + line: 41, + col: 22, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1213, + line: 41, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 1217, + line: 41, + col: 22, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1219, + line: 41, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 1227, + line: 41, + col: 32, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1219, + line: 41, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 1227, + line: 41, + col: 32, + }, + }, + Name: "exc_type", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1229, + line: 41, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 1238, + line: 41, + col: 43, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1229, + line: 41, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 1238, + line: 41, + col: 43, + }, + }, + Name: "exc_value", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1240, + line: 41, + col: 45, + }, + end: { '@type': "uast:Position", + offset: 1242, + line: 41, + col: 47, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1240, + line: 41, + col: 45, + }, + end: { '@type': "uast:Position", + offset: 1242, + line: 41, + col: 47, + }, + }, + Name: "tb", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_143_src.uast b/uast/diff/testdata/testcase_143_src.uast new file mode 100644 index 00000000..faadd6b4 --- /dev/null +++ b/uast/diff/testdata/testcase_143_src.uast @@ -0,0 +1,1647 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 281, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 284, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask.testing\n ~~~~~~~~~~~~~\n\n Implements test support helpers. This module is lazily imported\n and usually not used in production environments.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 285, + line: 12, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 298, + line: 12, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Client", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 313, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 323, + line: 13, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "ClassDef", + '@token': "FlaskClient", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 358, + line: 16, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 369, + line: 16, + col: 18, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 370, + line: 16, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 376, + line: 16, + col: 25, + }, + }, + Name: "Client", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 384, + line: 18, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 384, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 400, + line: 18, + col: 21, + }, + }, + Name: "preserve_context", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 403, + line: 18, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 420, + line: 18, + col: 41, + }, + }, + Name: "context_preserved", + }, + ], + value: { '@type': "BoolLiteral", + '@token': "False", + '@role': [Boolean, Expression, Literal, Primitive, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 423, + line: 18, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 428, + line: 18, + col: 49, + }, + }, + value: false, + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 438, + line: 20, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 442, + line: 20, + col: 13, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "open", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 475, + line: 21, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 477, + line: 21, + col: 11, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 514, + line: 22, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 514, + line: 22, + col: 13, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 515, + line: 22, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 533, + line: 22, + col: 32, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 514, + line: 22, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 532, + line: 22, + col: 31, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 514, + line: 22, + col: 13, + }, + }, + Name: "pop", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 551, + line: 23, + col: 13, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 552, + line: 23, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 556, + line: 23, + col: 18, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 551, + line: 23, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 555, + line: 23, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 551, + line: 23, + col: 13, + }, + }, + Name: "context_preserved", + }, + ], + }, + ], + value: { '@type': "BoolLiteral", + '@token': "False", + '@role': [Boolean, Expression, Literal, Primitive, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 576, + line: 23, + col: 38, + }, + end: { '@type': "uast:Position", + offset: 581, + line: 23, + col: 43, + }, + }, + value: false, + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "QualifiedIdentifier", + '@role': [Condition, Expression, Identifier, If, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 479, + line: 21, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 483, + line: 21, + col: 17, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 478, + line: 21, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 482, + line: 21, + col: 16, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 478, + line: 21, + col: 12, + }, + }, + Name: "context_preserved", + }, + ], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 590, + line: 24, + col: 9, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 590, + line: 24, + col: 9, + }, + }, + ctx: "Store", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 648, + line: 25, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 673, + line: 25, + col: 39, + }, + }, + Format: "", + Value: "flask._preserve_context", + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 590, + line: 24, + col: 9, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 608, + line: 24, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 627, + line: 24, + col: 46, + }, + }, + Format: "", + Value: "environ_overrides", + }, + { '@type': "Dict", + '@role': [Argument, Call, Expression, Function, Literal, Map, Name, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 629, + line: 24, + col: 48, + }, + }, + keys: [], + values: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 591, + line: 24, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 597, + line: 24, + col: 16, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 590, + line: 24, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 596, + line: 24, + col: 15, + }, + }, + Name: "kwargs", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 590, + line: 24, + col: 9, + }, + }, + Name: "setdefault", + }, + ], + }, + keywords: [], + }, + }, + ], + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 678, + line: 25, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 682, + line: 25, + col: 48, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 677, + line: 25, + col: 43, + }, + end: { '@type': "uast:Position", + offset: 681, + line: 25, + col: 47, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 677, + line: 25, + col: 43, + }, + }, + Name: "preserve_context", + }, + ], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 707, + line: 26, + col: 9, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 707, + line: 26, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 710, + line: 26, + col: 12, + }, + }, + Name: "old", + }, + ], + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 714, + line: 26, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 732, + line: 26, + col: 34, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 713, + line: 26, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 731, + line: 26, + col: 33, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 713, + line: 26, + col: 15, + }, + }, + Name: "top", + }, + ], + }, + }, + { '@type': "Try", + '@token': "try", + '@role': [Statement, Try], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 744, + line: 27, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 747, + line: 27, + col: 12, + }, + }, + body: { '@type': "Try.body", + '@role': [Body, Try], + 'body_stmts': [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 761, + line: 28, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 767, + line: 28, + col: 19, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 768, + line: 28, + col: 20, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 780, + line: 28, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 784, + line: 28, + col: 36, + }, + }, + Name: "self", + }, + { '@type': "Starred", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 786, + line: 28, + col: 38, + }, + }, + ctx: "Load", + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 787, + line: 28, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 791, + line: 28, + col: 43, + }, + }, + Name: "args", + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 769, + line: 28, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 775, + line: 28, + col: 27, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 768, + line: 28, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 774, + line: 28, + col: 26, + }, + }, + Name: "Client", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 768, + line: 28, + col: 20, + }, + }, + Name: "open", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: ~, + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 795, + line: 28, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 801, + line: 28, + col: 53, + }, + }, + Name: "kwargs", + }, + }, + ], + }, + }, + ], + }, + finalbody: { '@type': "Try.finalbody", + '@token': "finally", + '@role': [Finally, Try], + 'final_stmts': [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 832, + line: 30, + col: 13, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 833, + line: 30, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 837, + line: 30, + col: 18, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 832, + line: 30, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 836, + line: 30, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 832, + line: 30, + col: 13, + }, + }, + Name: "context_preserved", + }, + ], + }, + ], + value: { '@type': "Compare", + '@role': [Binary, Condition, Expression, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 857, + line: 30, + col: 38, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 887, + line: 30, + col: 68, + }, + end: { '@type': "uast:Position", + offset: 890, + line: 30, + col: 71, + }, + }, + Name: "old", + }, + ], + }, + left: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 858, + line: 30, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 876, + line: 30, + col: 57, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 857, + line: 30, + col: 38, + }, + end: { '@type': "uast:Position", + offset: 875, + line: 30, + col: 56, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 857, + line: 30, + col: 38, + }, + }, + Name: "top", + }, + ], + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "IsNot", + '@token': "is not", + '@role': [Identical, Not, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + ], + }, + handlers: { '@type': "Try.handlers", + '@token': "except", + '@role': [Catch, Try], + handlers: [], + }, + orelse: { '@type': "Try.else", + '@token': "else", + '@role': [Else, Try], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 443, + line: 20, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 447, + line: 20, + col: 18, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 443, + line: 20, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 447, + line: 20, + col: 18, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 458, + line: 20, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 464, + line: 20, + col: 35, + }, + }, + Init: ~, + MapVariadic: true, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 458, + line: 20, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 464, + line: 20, + col: 35, + }, + }, + Name: "kwargs", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 450, + line: 20, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 454, + line: 20, + col: 25, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 450, + line: 20, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 454, + line: 20, + col: 25, + }, + }, + Name: "args", + }, + Receiver: false, + Type: ~, + Variadic: true, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 900, + line: 32, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 909, + line: 32, + col: 18, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "__enter__", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 925, + line: 33, + col: 9, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 926, + line: 33, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 930, + line: 33, + col: 14, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 925, + line: 33, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 929, + line: 33, + col: 13, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 925, + line: 33, + col: 9, + }, + }, + Name: "preserve_context", + }, + ], + }, + ], + value: { '@type': "BoolLiteral", + '@token': "True", + '@role': [Boolean, Expression, Literal, Primitive, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 949, + line: 33, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 953, + line: 33, + col: 37, + }, + }, + value: true, + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 962, + line: 34, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 968, + line: 34, + col: 15, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 969, + line: 34, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 973, + line: 34, + col: 20, + }, + }, + Name: "self", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 910, + line: 32, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 914, + line: 32, + col: 23, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 910, + line: 32, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 914, + line: 32, + col: 23, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 983, + line: 36, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 991, + line: 36, + col: 17, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "__exit__", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1032, + line: 37, + col: 9, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1033, + line: 37, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 1037, + line: 37, + col: 14, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1032, + line: 37, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1036, + line: 37, + col: 13, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1032, + line: 37, + col: 9, + }, + }, + Name: "preserve_context", + }, + ], + }, + ], + value: { '@type': "BoolLiteral", + '@token': "False", + '@role': [Boolean, Expression, Literal, Primitive, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1056, + line: 37, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 1061, + line: 37, + col: 38, + }, + }, + value: false, + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1070, + line: 38, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1072, + line: 38, + col: 11, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1109, + line: 39, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1109, + line: 39, + col: 13, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1110, + line: 39, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 1128, + line: 39, + col: 32, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1109, + line: 39, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1127, + line: 39, + col: 31, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1109, + line: 39, + col: 13, + }, + }, + Name: "pop", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "QualifiedIdentifier", + '@role': [Condition, Expression, Identifier, If, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1074, + line: 38, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1078, + line: 38, + col: 17, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1073, + line: 38, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 1077, + line: 38, + col: 16, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1073, + line: 38, + col: 12, + }, + }, + Name: "context_preserved", + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 992, + line: 36, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 996, + line: 36, + col: 22, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 992, + line: 36, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 996, + line: 36, + col: 22, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 998, + line: 36, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 1006, + line: 36, + col: 32, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 998, + line: 36, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 1006, + line: 36, + col: 32, + }, + }, + Name: "exc_type", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1008, + line: 36, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 1017, + line: 36, + col: 43, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1008, + line: 36, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 1017, + line: 36, + col: 43, + }, + }, + Name: "exc_value", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1019, + line: 36, + col: 45, + }, + end: { '@type': "uast:Position", + offset: 1021, + line: 36, + col: 47, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1019, + line: 36, + col: 45, + }, + end: { '@type': "uast:Position", + offset: 1021, + line: 36, + col: 47, + }, + }, + Name: "tb", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_144_dst.uast b/uast/diff/testdata/testcase_144_dst.uast new file mode 100644 index 00000000..48a4bf18 --- /dev/null +++ b/uast/diff/testdata/testcase_144_dst.uast @@ -0,0 +1,1673 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 281, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 284, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask.testing\n ~~~~~~~~~~~~~\n\n Implements test support helpers. This module is lazily imported\n and usually not used in production environments.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 286, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 299, + line: 13, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Client", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 314, + line: 14, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 324, + line: 14, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "ClassDef", + '@token': "FlaskClient", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 359, + line: 17, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 370, + line: 17, + col: 18, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 371, + line: 17, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 377, + line: 17, + col: 25, + }, + }, + Name: "Client", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 593, + line: 22, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 384, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 600, + line: 22, + col: 8, + }, + }, + Format: "", + Value: "Works like a regular Werkzeug test client but has some\n knowledge about how Flask works to defer the cleanup of the\n request context stack to the end of a with body when used\n in a with statement.\n ", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 606, + line: 24, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 606, + line: 24, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 622, + line: 24, + col: 21, + }, + }, + Name: "preserve_context", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 625, + line: 24, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 642, + line: 24, + col: 41, + }, + }, + Name: "context_preserved", + }, + ], + value: { '@type': "BoolLiteral", + '@token': "False", + '@role': [Boolean, Expression, Literal, Primitive, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 645, + line: 24, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 650, + line: 24, + col: 49, + }, + }, + value: false, + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 660, + line: 26, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 664, + line: 26, + col: 13, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "open", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 697, + line: 27, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 699, + line: 27, + col: 11, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 736, + line: 28, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 736, + line: 28, + col: 13, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 737, + line: 28, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 755, + line: 28, + col: 32, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 736, + line: 28, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 754, + line: 28, + col: 31, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 736, + line: 28, + col: 13, + }, + }, + Name: "pop", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 773, + line: 29, + col: 13, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 774, + line: 29, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 778, + line: 29, + col: 18, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 773, + line: 29, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 777, + line: 29, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 773, + line: 29, + col: 13, + }, + }, + Name: "context_preserved", + }, + ], + }, + ], + value: { '@type': "BoolLiteral", + '@token': "False", + '@role': [Boolean, Expression, Literal, Primitive, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 798, + line: 29, + col: 38, + }, + end: { '@type': "uast:Position", + offset: 803, + line: 29, + col: 43, + }, + }, + value: false, + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "QualifiedIdentifier", + '@role': [Condition, Expression, Identifier, If, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 701, + line: 27, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 705, + line: 27, + col: 17, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 700, + line: 27, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 704, + line: 27, + col: 16, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 700, + line: 27, + col: 12, + }, + }, + Name: "context_preserved", + }, + ], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 812, + line: 30, + col: 9, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 812, + line: 30, + col: 9, + }, + }, + ctx: "Store", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 870, + line: 31, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 895, + line: 31, + col: 39, + }, + }, + Format: "", + Value: "flask._preserve_context", + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 812, + line: 30, + col: 9, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 830, + line: 30, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 849, + line: 30, + col: 46, + }, + }, + Format: "", + Value: "environ_overrides", + }, + { '@type': "Dict", + '@role': [Argument, Call, Expression, Function, Literal, Map, Name, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 851, + line: 30, + col: 48, + }, + }, + keys: [], + values: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 813, + line: 30, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 819, + line: 30, + col: 16, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 812, + line: 30, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 818, + line: 30, + col: 15, + }, + }, + Name: "kwargs", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 812, + line: 30, + col: 9, + }, + }, + Name: "setdefault", + }, + ], + }, + keywords: [], + }, + }, + ], + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 900, + line: 31, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 904, + line: 31, + col: 48, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 899, + line: 31, + col: 43, + }, + end: { '@type': "uast:Position", + offset: 903, + line: 31, + col: 47, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 899, + line: 31, + col: 43, + }, + }, + Name: "preserve_context", + }, + ], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 929, + line: 32, + col: 9, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 929, + line: 32, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 932, + line: 32, + col: 12, + }, + }, + Name: "old", + }, + ], + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 936, + line: 32, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 954, + line: 32, + col: 34, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 935, + line: 32, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 953, + line: 32, + col: 33, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 935, + line: 32, + col: 15, + }, + }, + Name: "top", + }, + ], + }, + }, + { '@type': "Try", + '@token': "try", + '@role': [Statement, Try], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 966, + line: 33, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 969, + line: 33, + col: 12, + }, + }, + body: { '@type': "Try.body", + '@role': [Body, Try], + 'body_stmts': [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 983, + line: 34, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 989, + line: 34, + col: 19, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 990, + line: 34, + col: 20, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1002, + line: 34, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 1006, + line: 34, + col: 36, + }, + }, + Name: "self", + }, + { '@type': "Starred", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1008, + line: 34, + col: 38, + }, + }, + ctx: "Load", + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1009, + line: 34, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 1013, + line: 34, + col: 43, + }, + }, + Name: "args", + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 991, + line: 34, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 997, + line: 34, + col: 27, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 990, + line: 34, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 996, + line: 34, + col: 26, + }, + }, + Name: "Client", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 990, + line: 34, + col: 20, + }, + }, + Name: "open", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: ~, + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1017, + line: 34, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 1023, + line: 34, + col: 53, + }, + }, + Name: "kwargs", + }, + }, + ], + }, + }, + ], + }, + finalbody: { '@type': "Try.finalbody", + '@token': "finally", + '@role': [Finally, Try], + 'final_stmts': [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1054, + line: 36, + col: 13, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1055, + line: 36, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 1059, + line: 36, + col: 18, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1054, + line: 36, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1058, + line: 36, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1054, + line: 36, + col: 13, + }, + }, + Name: "context_preserved", + }, + ], + }, + ], + value: { '@type': "Compare", + '@role': [Binary, Condition, Expression, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1079, + line: 36, + col: 38, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1109, + line: 36, + col: 68, + }, + end: { '@type': "uast:Position", + offset: 1112, + line: 36, + col: 71, + }, + }, + Name: "old", + }, + ], + }, + left: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1080, + line: 36, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 1098, + line: 36, + col: 57, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1079, + line: 36, + col: 38, + }, + end: { '@type': "uast:Position", + offset: 1097, + line: 36, + col: 56, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1079, + line: 36, + col: 38, + }, + }, + Name: "top", + }, + ], + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "IsNot", + '@token': "is not", + '@role': [Identical, Not, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + ], + }, + handlers: { '@type': "Try.handlers", + '@token': "except", + '@role': [Catch, Try], + handlers: [], + }, + orelse: { '@type': "Try.else", + '@token': "else", + '@role': [Else, Try], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 665, + line: 26, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 669, + line: 26, + col: 18, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 665, + line: 26, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 669, + line: 26, + col: 18, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 680, + line: 26, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 686, + line: 26, + col: 35, + }, + }, + Init: ~, + MapVariadic: true, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 680, + line: 26, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 686, + line: 26, + col: 35, + }, + }, + Name: "kwargs", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 672, + line: 26, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 676, + line: 26, + col: 25, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 672, + line: 26, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 676, + line: 26, + col: 25, + }, + }, + Name: "args", + }, + Receiver: false, + Type: ~, + Variadic: true, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1122, + line: 38, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1131, + line: 38, + col: 18, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "__enter__", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1147, + line: 39, + col: 9, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1148, + line: 39, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 1152, + line: 39, + col: 14, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1147, + line: 39, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1151, + line: 39, + col: 13, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1147, + line: 39, + col: 9, + }, + }, + Name: "preserve_context", + }, + ], + }, + ], + value: { '@type': "BoolLiteral", + '@token': "True", + '@role': [Boolean, Expression, Literal, Primitive, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1171, + line: 39, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 1175, + line: 39, + col: 37, + }, + }, + value: true, + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1184, + line: 40, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1190, + line: 40, + col: 15, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1191, + line: 40, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 1195, + line: 40, + col: 20, + }, + }, + Name: "self", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1132, + line: 38, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 1136, + line: 38, + col: 23, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1132, + line: 38, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 1136, + line: 38, + col: 23, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1205, + line: 42, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1213, + line: 42, + col: 17, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "__exit__", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1254, + line: 43, + col: 9, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1255, + line: 43, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 1259, + line: 43, + col: 14, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1254, + line: 43, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1258, + line: 43, + col: 13, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1254, + line: 43, + col: 9, + }, + }, + Name: "preserve_context", + }, + ], + }, + ], + value: { '@type': "BoolLiteral", + '@token': "False", + '@role': [Boolean, Expression, Literal, Primitive, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1278, + line: 43, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 1283, + line: 43, + col: 38, + }, + }, + value: false, + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1292, + line: 44, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1294, + line: 44, + col: 11, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1331, + line: 45, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1331, + line: 45, + col: 13, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1332, + line: 45, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 1350, + line: 45, + col: 32, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1331, + line: 45, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1349, + line: 45, + col: 31, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1331, + line: 45, + col: 13, + }, + }, + Name: "pop", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "QualifiedIdentifier", + '@role': [Condition, Expression, Identifier, If, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1296, + line: 44, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1300, + line: 44, + col: 17, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1295, + line: 44, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 1299, + line: 44, + col: 16, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1295, + line: 44, + col: 12, + }, + }, + Name: "context_preserved", + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1214, + line: 42, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 1218, + line: 42, + col: 22, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1214, + line: 42, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 1218, + line: 42, + col: 22, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1220, + line: 42, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 1228, + line: 42, + col: 32, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1220, + line: 42, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 1228, + line: 42, + col: 32, + }, + }, + Name: "exc_type", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1230, + line: 42, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 1239, + line: 42, + col: 43, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1230, + line: 42, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 1239, + line: 42, + col: 43, + }, + }, + Name: "exc_value", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1241, + line: 42, + col: 45, + }, + end: { '@type': "uast:Position", + offset: 1243, + line: 42, + col: 47, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1241, + line: 42, + col: 45, + }, + end: { '@type': "uast:Position", + offset: 1243, + line: 42, + col: 47, + }, + }, + Name: "tb", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_144_src.uast b/uast/diff/testdata/testcase_144_src.uast new file mode 100644 index 00000000..b8137c85 --- /dev/null +++ b/uast/diff/testdata/testcase_144_src.uast @@ -0,0 +1,1673 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 281, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 284, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask.testing\n ~~~~~~~~~~~~~\n\n Implements test support helpers. This module is lazily imported\n and usually not used in production environments.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 285, + line: 12, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 298, + line: 12, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Client", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 313, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 323, + line: 13, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "ClassDef", + '@token': "FlaskClient", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 358, + line: 16, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 369, + line: 16, + col: 18, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 370, + line: 16, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 376, + line: 16, + col: 25, + }, + }, + Name: "Client", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 592, + line: 21, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 383, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 599, + line: 21, + col: 8, + }, + }, + Format: "", + Value: "Works like a regular Werkzeug test client but has some\n knowledge about how Flask works to defer the cleanup of the\n request context stack to the end of a with body when used\n in a with statement.\n ", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 605, + line: 23, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 605, + line: 23, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 621, + line: 23, + col: 21, + }, + }, + Name: "preserve_context", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 624, + line: 23, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 641, + line: 23, + col: 41, + }, + }, + Name: "context_preserved", + }, + ], + value: { '@type': "BoolLiteral", + '@token': "False", + '@role': [Boolean, Expression, Literal, Primitive, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 644, + line: 23, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 649, + line: 23, + col: 49, + }, + }, + value: false, + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 659, + line: 25, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 663, + line: 25, + col: 13, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "open", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 696, + line: 26, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 698, + line: 26, + col: 11, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 735, + line: 27, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 735, + line: 27, + col: 13, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 736, + line: 27, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 754, + line: 27, + col: 32, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 735, + line: 27, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 753, + line: 27, + col: 31, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 735, + line: 27, + col: 13, + }, + }, + Name: "pop", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 772, + line: 28, + col: 13, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 773, + line: 28, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 777, + line: 28, + col: 18, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 772, + line: 28, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 776, + line: 28, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 772, + line: 28, + col: 13, + }, + }, + Name: "context_preserved", + }, + ], + }, + ], + value: { '@type': "BoolLiteral", + '@token': "False", + '@role': [Boolean, Expression, Literal, Primitive, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 797, + line: 28, + col: 38, + }, + end: { '@type': "uast:Position", + offset: 802, + line: 28, + col: 43, + }, + }, + value: false, + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "QualifiedIdentifier", + '@role': [Condition, Expression, Identifier, If, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 700, + line: 26, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 704, + line: 26, + col: 17, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 699, + line: 26, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 703, + line: 26, + col: 16, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 699, + line: 26, + col: 12, + }, + }, + Name: "context_preserved", + }, + ], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 811, + line: 29, + col: 9, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 811, + line: 29, + col: 9, + }, + }, + ctx: "Store", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 869, + line: 30, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 894, + line: 30, + col: 39, + }, + }, + Format: "", + Value: "flask._preserve_context", + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 811, + line: 29, + col: 9, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 829, + line: 29, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 848, + line: 29, + col: 46, + }, + }, + Format: "", + Value: "environ_overrides", + }, + { '@type': "Dict", + '@role': [Argument, Call, Expression, Function, Literal, Map, Name, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 850, + line: 29, + col: 48, + }, + }, + keys: [], + values: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 812, + line: 29, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 818, + line: 29, + col: 16, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 811, + line: 29, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 817, + line: 29, + col: 15, + }, + }, + Name: "kwargs", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 811, + line: 29, + col: 9, + }, + }, + Name: "setdefault", + }, + ], + }, + keywords: [], + }, + }, + ], + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 899, + line: 30, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 903, + line: 30, + col: 48, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 898, + line: 30, + col: 43, + }, + end: { '@type': "uast:Position", + offset: 902, + line: 30, + col: 47, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 898, + line: 30, + col: 43, + }, + }, + Name: "preserve_context", + }, + ], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 928, + line: 31, + col: 9, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 928, + line: 31, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 931, + line: 31, + col: 12, + }, + }, + Name: "old", + }, + ], + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 935, + line: 31, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 953, + line: 31, + col: 34, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 934, + line: 31, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 952, + line: 31, + col: 33, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 934, + line: 31, + col: 15, + }, + }, + Name: "top", + }, + ], + }, + }, + { '@type': "Try", + '@token': "try", + '@role': [Statement, Try], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 965, + line: 32, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 968, + line: 32, + col: 12, + }, + }, + body: { '@type': "Try.body", + '@role': [Body, Try], + 'body_stmts': [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 982, + line: 33, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 988, + line: 33, + col: 19, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 989, + line: 33, + col: 20, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1001, + line: 33, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 1005, + line: 33, + col: 36, + }, + }, + Name: "self", + }, + { '@type': "Starred", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1007, + line: 33, + col: 38, + }, + }, + ctx: "Load", + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1008, + line: 33, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 1012, + line: 33, + col: 43, + }, + }, + Name: "args", + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 990, + line: 33, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 996, + line: 33, + col: 27, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 989, + line: 33, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 995, + line: 33, + col: 26, + }, + }, + Name: "Client", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 989, + line: 33, + col: 20, + }, + }, + Name: "open", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: ~, + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1016, + line: 33, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 1022, + line: 33, + col: 53, + }, + }, + Name: "kwargs", + }, + }, + ], + }, + }, + ], + }, + finalbody: { '@type': "Try.finalbody", + '@token': "finally", + '@role': [Finally, Try], + 'final_stmts': [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1053, + line: 35, + col: 13, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1054, + line: 35, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 1058, + line: 35, + col: 18, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1053, + line: 35, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1057, + line: 35, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1053, + line: 35, + col: 13, + }, + }, + Name: "context_preserved", + }, + ], + }, + ], + value: { '@type': "Compare", + '@role': [Binary, Condition, Expression, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1078, + line: 35, + col: 38, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1108, + line: 35, + col: 68, + }, + end: { '@type': "uast:Position", + offset: 1111, + line: 35, + col: 71, + }, + }, + Name: "old", + }, + ], + }, + left: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1079, + line: 35, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 1097, + line: 35, + col: 57, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1078, + line: 35, + col: 38, + }, + end: { '@type': "uast:Position", + offset: 1096, + line: 35, + col: 56, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1078, + line: 35, + col: 38, + }, + }, + Name: "top", + }, + ], + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "IsNot", + '@token': "is not", + '@role': [Identical, Not, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + ], + }, + handlers: { '@type': "Try.handlers", + '@token': "except", + '@role': [Catch, Try], + handlers: [], + }, + orelse: { '@type': "Try.else", + '@token': "else", + '@role': [Else, Try], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 664, + line: 25, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 668, + line: 25, + col: 18, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 664, + line: 25, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 668, + line: 25, + col: 18, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 679, + line: 25, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 685, + line: 25, + col: 35, + }, + }, + Init: ~, + MapVariadic: true, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 679, + line: 25, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 685, + line: 25, + col: 35, + }, + }, + Name: "kwargs", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 671, + line: 25, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 675, + line: 25, + col: 25, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 671, + line: 25, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 675, + line: 25, + col: 25, + }, + }, + Name: "args", + }, + Receiver: false, + Type: ~, + Variadic: true, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1121, + line: 37, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1130, + line: 37, + col: 18, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "__enter__", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1146, + line: 38, + col: 9, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1147, + line: 38, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 1151, + line: 38, + col: 14, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1146, + line: 38, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1150, + line: 38, + col: 13, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1146, + line: 38, + col: 9, + }, + }, + Name: "preserve_context", + }, + ], + }, + ], + value: { '@type': "BoolLiteral", + '@token': "True", + '@role': [Boolean, Expression, Literal, Primitive, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1170, + line: 38, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 1174, + line: 38, + col: 37, + }, + }, + value: true, + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1183, + line: 39, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1189, + line: 39, + col: 15, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1190, + line: 39, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 1194, + line: 39, + col: 20, + }, + }, + Name: "self", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1131, + line: 37, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 1135, + line: 37, + col: 23, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1131, + line: 37, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 1135, + line: 37, + col: 23, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1204, + line: 41, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1212, + line: 41, + col: 17, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "__exit__", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1253, + line: 42, + col: 9, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1254, + line: 42, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 1258, + line: 42, + col: 14, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1253, + line: 42, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1257, + line: 42, + col: 13, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1253, + line: 42, + col: 9, + }, + }, + Name: "preserve_context", + }, + ], + }, + ], + value: { '@type': "BoolLiteral", + '@token': "False", + '@role': [Boolean, Expression, Literal, Primitive, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1277, + line: 42, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 1282, + line: 42, + col: 38, + }, + }, + value: false, + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1291, + line: 43, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1293, + line: 43, + col: 11, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1330, + line: 44, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1330, + line: 44, + col: 13, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1331, + line: 44, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 1349, + line: 44, + col: 32, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1330, + line: 44, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1348, + line: 44, + col: 31, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1330, + line: 44, + col: 13, + }, + }, + Name: "pop", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "QualifiedIdentifier", + '@role': [Condition, Expression, Identifier, If, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1295, + line: 43, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1299, + line: 43, + col: 17, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1294, + line: 43, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 1298, + line: 43, + col: 16, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1294, + line: 43, + col: 12, + }, + }, + Name: "context_preserved", + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1213, + line: 41, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 1217, + line: 41, + col: 22, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1213, + line: 41, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 1217, + line: 41, + col: 22, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1219, + line: 41, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 1227, + line: 41, + col: 32, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1219, + line: 41, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 1227, + line: 41, + col: 32, + }, + }, + Name: "exc_type", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1229, + line: 41, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 1238, + line: 41, + col: 43, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1229, + line: 41, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 1238, + line: 41, + col: 43, + }, + }, + Name: "exc_value", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1240, + line: 41, + col: 45, + }, + end: { '@type': "uast:Position", + offset: 1242, + line: 41, + col: 47, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1240, + line: 41, + col: 45, + }, + end: { '@type': "uast:Position", + offset: 1242, + line: 41, + col: 47, + }, + }, + Name: "tb", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_145_dst.uast b/uast/diff/testdata/testcase_145_dst.uast new file mode 100644 index 00000000..c96e0853 --- /dev/null +++ b/uast/diff/testdata/testcase_145_dst.uast @@ -0,0 +1,726 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 13, + col: 12, + }, + }, + Name: "__version__", + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 13, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 280, + line: 13, + col: 24, + }, + }, + Format: "", + Value: "0.9-dev", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 399, + line: 17, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.exceptions", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 437, + line: 18, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.utils", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 473, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 484, + line: 19, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 508, + line: 21, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 517, + line: 21, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 550, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 562, + line: 22, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 577, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 590, + line: 23, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "stream_with_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 781, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 794, + line: 27, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_app_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 878, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 887, + line: 29, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_app_context", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "after_this_request", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 959, + line: 31, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 971, + line: 31, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 986, + line: 32, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1002, + line: 32, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1020, + line: 33, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1036, + line: 33, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1099, + line: 36, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1112, + line: 36, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1282, + line: 40, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1284, + line: 40, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1305, + line: 41, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1318, + line: 41, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1285, + line: 40, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1299, + line: 40, + col: 18, + }, + }, + Name: "json_available", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1369, + line: 44, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1383, + line: 44, + col: 15, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "SecureCookieSession", + }, + Node: { '@type': "uast:Identifier", + Name: "Session", + }, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../sessions", + }, + Target: ~, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_145_src.uast b/uast/diff/testdata/testcase_145_src.uast new file mode 100644 index 00000000..645ba4aa --- /dev/null +++ b/uast/diff/testdata/testcase_145_src.uast @@ -0,0 +1,718 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 13, + col: 12, + }, + }, + Name: "__version__", + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 13, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 280, + line: 13, + col: 24, + }, + }, + Format: "", + Value: "0.9-dev", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 399, + line: 17, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.exceptions", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 437, + line: 18, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.utils", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 473, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 484, + line: 19, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 508, + line: 21, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 517, + line: 21, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 550, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 562, + line: 22, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 577, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 590, + line: 23, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 754, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 767, + line: 26, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_app_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 851, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 860, + line: 28, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_app_context", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "after_this_request", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 932, + line: 30, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 944, + line: 30, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 959, + line: 31, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 975, + line: 31, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 993, + line: 32, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1009, + line: 32, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1072, + line: 35, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1085, + line: 35, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1255, + line: 39, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1257, + line: 39, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1278, + line: 40, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1291, + line: 40, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1258, + line: 39, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1272, + line: 39, + col: 18, + }, + }, + Name: "json_available", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1342, + line: 43, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1356, + line: 43, + col: 15, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "SecureCookieSession", + }, + Node: { '@type': "uast:Identifier", + Name: "Session", + }, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../sessions", + }, + Target: ~, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_146_dst.uast b/uast/diff/testdata/testcase_146_dst.uast new file mode 100644 index 00000000..1af4b7e3 --- /dev/null +++ b/uast/diff/testdata/testcase_146_dst.uast @@ -0,0 +1,726 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 13, + col: 12, + }, + }, + Name: "__version__", + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 13, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 276, + line: 13, + col: 20, + }, + }, + Format: "", + Value: "0.9", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 395, + line: 17, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.exceptions", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 433, + line: 18, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.utils", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 469, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 480, + line: 19, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 504, + line: 21, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 513, + line: 21, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 546, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 558, + line: 22, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 573, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 586, + line: 23, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "stream_with_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 777, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 790, + line: 27, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_app_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 874, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 883, + line: 29, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_app_context", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "after_this_request", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 955, + line: 31, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 967, + line: 31, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 982, + line: 32, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 998, + line: 32, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1016, + line: 33, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1032, + line: 33, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1095, + line: 36, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1108, + line: 36, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1278, + line: 40, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1280, + line: 40, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1301, + line: 41, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1314, + line: 41, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1281, + line: 40, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1295, + line: 40, + col: 18, + }, + }, + Name: "json_available", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1365, + line: 44, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1379, + line: 44, + col: 15, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "SecureCookieSession", + }, + Node: { '@type': "uast:Identifier", + Name: "Session", + }, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../sessions", + }, + Target: ~, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_146_src.uast b/uast/diff/testdata/testcase_146_src.uast new file mode 100644 index 00000000..c96e0853 --- /dev/null +++ b/uast/diff/testdata/testcase_146_src.uast @@ -0,0 +1,726 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 13, + col: 12, + }, + }, + Name: "__version__", + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 13, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 280, + line: 13, + col: 24, + }, + }, + Format: "", + Value: "0.9-dev", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 399, + line: 17, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.exceptions", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 437, + line: 18, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.utils", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 473, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 484, + line: 19, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 508, + line: 21, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 517, + line: 21, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 550, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 562, + line: 22, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 577, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 590, + line: 23, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "stream_with_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 781, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 794, + line: 27, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_app_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 878, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 887, + line: 29, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_app_context", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "after_this_request", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 959, + line: 31, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 971, + line: 31, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 986, + line: 32, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1002, + line: 32, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1020, + line: 33, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1036, + line: 33, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1099, + line: 36, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1112, + line: 36, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1282, + line: 40, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1284, + line: 40, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1305, + line: 41, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1318, + line: 41, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1285, + line: 40, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1299, + line: 40, + col: 18, + }, + }, + Name: "json_available", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1369, + line: 44, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1383, + line: 44, + col: 15, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "SecureCookieSession", + }, + Node: { '@type': "uast:Identifier", + Name: "Session", + }, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../sessions", + }, + Target: ~, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_147_dst.uast b/uast/diff/testdata/testcase_147_dst.uast new file mode 100644 index 00000000..fe2a1e35 --- /dev/null +++ b/uast/diff/testdata/testcase_147_dst.uast @@ -0,0 +1,726 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 13, + col: 12, + }, + }, + Name: "__version__", + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 13, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 281, + line: 13, + col: 25, + }, + }, + Format: "", + Value: "0.10-dev", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 400, + line: 17, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.exceptions", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 438, + line: 18, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.utils", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 474, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 485, + line: 19, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 509, + line: 21, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 518, + line: 21, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 551, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 563, + line: 22, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 578, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 591, + line: 23, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "stream_with_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 782, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 795, + line: 27, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_app_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 879, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 888, + line: 29, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_app_context", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "after_this_request", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 960, + line: 31, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 972, + line: 31, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 987, + line: 32, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1003, + line: 32, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1021, + line: 33, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1037, + line: 33, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1100, + line: 36, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1113, + line: 36, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1283, + line: 40, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1285, + line: 40, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1306, + line: 41, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1319, + line: 41, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1286, + line: 40, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1300, + line: 40, + col: 18, + }, + }, + Name: "json_available", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1370, + line: 44, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1384, + line: 44, + col: 15, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "SecureCookieSession", + }, + Node: { '@type': "uast:Identifier", + Name: "Session", + }, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../sessions", + }, + Target: ~, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_147_src.uast b/uast/diff/testdata/testcase_147_src.uast new file mode 100644 index 00000000..1af4b7e3 --- /dev/null +++ b/uast/diff/testdata/testcase_147_src.uast @@ -0,0 +1,726 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 13, + col: 12, + }, + }, + Name: "__version__", + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 13, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 276, + line: 13, + col: 20, + }, + }, + Format: "", + Value: "0.9", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 395, + line: 17, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.exceptions", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 433, + line: 18, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.utils", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 469, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 480, + line: 19, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 504, + line: 21, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 513, + line: 21, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 546, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 558, + line: 22, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 573, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 586, + line: 23, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "stream_with_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 777, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 790, + line: 27, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_app_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 874, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 883, + line: 29, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_app_context", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "after_this_request", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 955, + line: 31, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 967, + line: 31, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 982, + line: 32, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 998, + line: 32, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1016, + line: 33, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1032, + line: 33, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1095, + line: 36, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1108, + line: 36, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1278, + line: 40, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1280, + line: 40, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1301, + line: 41, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1314, + line: 41, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1281, + line: 40, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1295, + line: 40, + col: 18, + }, + }, + Name: "json_available", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1365, + line: 44, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1379, + line: 44, + col: 15, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "SecureCookieSession", + }, + Node: { '@type': "uast:Identifier", + Name: "Session", + }, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../sessions", + }, + Target: ~, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_14_dst.uast b/uast/diff/testdata/testcase_14_dst.uast new file mode 100644 index 00000000..252a6453 --- /dev/null +++ b/uast/diff/testdata/testcase_14_dst.uast @@ -0,0 +1,472 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 10, + line: 1, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "simple_page", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "simple_page.simple_page", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 73, + line: 4, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 73, + line: 4, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 76, + line: 4, + col: 4, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 79, + line: 4, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 85, + line: 4, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 93, + line: 4, + col: 21, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 79, + line: 4, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 84, + line: 4, + col: 12, + }, + }, + Name: "Flask", + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 95, + line: 5, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 95, + line: 5, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 118, + line: 5, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 129, + line: 5, + col: 35, + }, + }, + Name: "simple_page", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 96, + line: 5, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 99, + line: 5, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 95, + line: 5, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 98, + line: 5, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 95, + line: 5, + col: 1, + }, + }, + Name: "register_blueprint", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 172, + line: 7, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 172, + line: 7, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 195, + line: 7, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 206, + line: 7, + col: 35, + }, + }, + Name: "simple_page", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 173, + line: 7, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 176, + line: 7, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 172, + line: 7, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 175, + line: 7, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 172, + line: 7, + col: 1, + }, + }, + Name: "register_blueprint", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "url_prefix", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 219, + line: 7, + col: 48, + }, + end: { '@type': "uast:Position", + offset: 227, + line: 7, + col: 56, + }, + }, + Format: "", + Value: "/pages", + }, + }, + ], + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 230, + line: 9, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 232, + line: 9, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 10, + col: 3, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 10, + col: 3, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 258, + line: 10, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 261, + line: 10, + col: 7, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 10, + col: 3, + }, + end: { '@type': "uast:Position", + offset: 260, + line: 10, + col: 6, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 10, + col: 3, + }, + }, + Name: "run", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 233, + line: 9, + col: 4, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 243, + line: 9, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 253, + line: 9, + col: 24, + }, + }, + Format: "", + Value: "__main__", + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 233, + line: 9, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 241, + line: 9, + col: 12, + }, + }, + Name: "__name__", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_14_src.uast b/uast/diff/testdata/testcase_14_src.uast new file mode 100644 index 00000000..dcea5f8e --- /dev/null +++ b/uast/diff/testdata/testcase_14_src.uast @@ -0,0 +1,323 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 10, + line: 1, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "simple_page", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "simple_page.simple_page", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 73, + line: 4, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 73, + line: 4, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 76, + line: 4, + col: 4, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 79, + line: 4, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 85, + line: 4, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 93, + line: 4, + col: 21, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 79, + line: 4, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 84, + line: 4, + col: 12, + }, + }, + Name: "Flask", + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 95, + line: 5, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 95, + line: 5, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 118, + line: 5, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 129, + line: 5, + col: 35, + }, + }, + Name: "simple_page", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 96, + line: 5, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 99, + line: 5, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 95, + line: 5, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 98, + line: 5, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 95, + line: 5, + col: 1, + }, + }, + Name: "register_blueprint", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 172, + line: 7, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 172, + line: 7, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 195, + line: 7, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 206, + line: 7, + col: 35, + }, + }, + Name: "simple_page", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 173, + line: 7, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 176, + line: 7, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 172, + line: 7, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 175, + line: 7, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 172, + line: 7, + col: 1, + }, + }, + Name: "register_blueprint", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "url_prefix", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 219, + line: 7, + col: 48, + }, + end: { '@type': "uast:Position", + offset: 227, + line: 7, + col: 56, + }, + }, + Format: "", + Value: "/pages", + }, + }, + ], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_15_dst.uast b/uast/diff/testdata/testcase_15_dst.uast new file mode 100644 index 00000000..5f515f47 --- /dev/null +++ b/uast/diff/testdata/testcase_15_dst.uast @@ -0,0 +1,682 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 246, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 249, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask.globals\n ~~~~~~~~~~~~~\n\n Defines all the global objects that are proxies to the current\n active context.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 251, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 264, + line: 13, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "LocalStack", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "LocalProxy", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 313, + line: 16, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 313, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 331, + line: 16, + col: 19, + }, + }, + Name: "_request_ctx_stack", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 334, + line: 16, + col: 22, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 334, + line: 16, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 344, + line: 16, + col: 32, + }, + }, + Name: "LocalStack", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 347, + line: 17, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 347, + line: 17, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 358, + line: 17, + col: 12, + }, + }, + Name: "current_app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 361, + line: 17, + col: 15, + }, + }, + args: [ + { '@type': "Lambda", + '@role': [Anonymous, Argument, Call, Declaration, Function, Name, Positional, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 372, + line: 17, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 378, + line: 17, + col: 32, + }, + }, + args: { '@type': "arguments", + '@role': [Argument, Declaration, Function, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + args: [], + }, + body: { '@type': "FunctionDef.body", + '@role': [Body, Declaration, Function], + 'body_stmts': { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 381, + line: 17, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 399, + line: 17, + col: 53, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 380, + line: 17, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 398, + line: 17, + col: 52, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 399, + line: 17, + col: 53, + }, + end: { '@type': "uast:Position", + offset: 402, + line: 17, + col: 56, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 380, + line: 17, + col: 34, + }, + }, + Name: "app", + }, + ], + }, + }, + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 361, + line: 17, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 371, + line: 17, + col: 25, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 408, + line: 18, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 408, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 415, + line: 18, + col: 8, + }, + }, + Name: "request", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 418, + line: 18, + col: 11, + }, + }, + args: [ + { '@type': "Lambda", + '@role': [Anonymous, Argument, Call, Declaration, Function, Name, Positional, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 429, + line: 18, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 435, + line: 18, + col: 28, + }, + }, + args: { '@type': "arguments", + '@role': [Argument, Declaration, Function, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + args: [], + }, + body: { '@type': "FunctionDef.body", + '@role': [Body, Declaration, Function], + 'body_stmts': { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 438, + line: 18, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 456, + line: 18, + col: 49, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 437, + line: 18, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 455, + line: 18, + col: 48, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 456, + line: 18, + col: 49, + }, + end: { '@type': "uast:Position", + offset: 459, + line: 18, + col: 52, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 437, + line: 18, + col: 30, + }, + }, + Name: "request", + }, + ], + }, + }, + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 418, + line: 18, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 428, + line: 18, + col: 21, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 469, + line: 19, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 469, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 476, + line: 19, + col: 8, + }, + }, + Name: "session", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 479, + line: 19, + col: 11, + }, + }, + args: [ + { '@type': "Lambda", + '@role': [Anonymous, Argument, Call, Declaration, Function, Name, Positional, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 490, + line: 19, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 496, + line: 19, + col: 28, + }, + }, + args: { '@type': "arguments", + '@role': [Argument, Declaration, Function, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + args: [], + }, + body: { '@type': "FunctionDef.body", + '@role': [Body, Declaration, Function], + 'body_stmts': { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 499, + line: 19, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 517, + line: 19, + col: 49, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 498, + line: 19, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 516, + line: 19, + col: 48, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 517, + line: 19, + col: 49, + }, + end: { '@type': "uast:Position", + offset: 520, + line: 19, + col: 52, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 498, + line: 19, + col: 30, + }, + }, + Name: "session", + }, + ], + }, + }, + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 479, + line: 19, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 489, + line: 19, + col: 21, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 530, + line: 20, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 530, + line: 20, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 531, + line: 20, + col: 2, + }, + }, + Name: "g", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 534, + line: 20, + col: 5, + }, + }, + args: [ + { '@type': "Lambda", + '@role': [Anonymous, Argument, Call, Declaration, Function, Name, Positional, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 545, + line: 20, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 551, + line: 20, + col: 22, + }, + }, + args: { '@type': "arguments", + '@role': [Argument, Declaration, Function, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + args: [], + }, + body: { '@type': "FunctionDef.body", + '@role': [Body, Declaration, Function], + 'body_stmts': { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 554, + line: 20, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 572, + line: 20, + col: 43, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 553, + line: 20, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 571, + line: 20, + col: 42, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 572, + line: 20, + col: 43, + }, + end: { '@type': "uast:Position", + offset: 575, + line: 20, + col: 46, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 553, + line: 20, + col: 24, + }, + }, + Name: "g", + }, + ], + }, + }, + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 534, + line: 20, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 544, + line: 20, + col: 15, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_15_src.uast b/uast/diff/testdata/testcase_15_src.uast new file mode 100644 index 00000000..f00b378d --- /dev/null +++ b/uast/diff/testdata/testcase_15_src.uast @@ -0,0 +1,656 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 13, + line: 1, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "LocalStack", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "LocalProxy", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 62, + line: 4, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 62, + line: 4, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 80, + line: 4, + col: 19, + }, + }, + Name: "_request_ctx_stack", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 83, + line: 4, + col: 22, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 83, + line: 4, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 93, + line: 4, + col: 32, + }, + }, + Name: "LocalStack", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 96, + line: 5, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 96, + line: 5, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 107, + line: 5, + col: 12, + }, + }, + Name: "current_app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 110, + line: 5, + col: 15, + }, + }, + args: [ + { '@type': "Lambda", + '@role': [Anonymous, Argument, Call, Declaration, Function, Name, Positional, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 121, + line: 5, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 127, + line: 5, + col: 32, + }, + }, + args: { '@type': "arguments", + '@role': [Argument, Declaration, Function, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + args: [], + }, + body: { '@type': "FunctionDef.body", + '@role': [Body, Declaration, Function], + 'body_stmts': { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 130, + line: 5, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 148, + line: 5, + col: 53, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 129, + line: 5, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 147, + line: 5, + col: 52, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 148, + line: 5, + col: 53, + }, + end: { '@type': "uast:Position", + offset: 151, + line: 5, + col: 56, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 129, + line: 5, + col: 34, + }, + }, + Name: "app", + }, + ], + }, + }, + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 110, + line: 5, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 120, + line: 5, + col: 25, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 157, + line: 6, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 157, + line: 6, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 164, + line: 6, + col: 8, + }, + }, + Name: "request", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 167, + line: 6, + col: 11, + }, + }, + args: [ + { '@type': "Lambda", + '@role': [Anonymous, Argument, Call, Declaration, Function, Name, Positional, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 178, + line: 6, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 184, + line: 6, + col: 28, + }, + }, + args: { '@type': "arguments", + '@role': [Argument, Declaration, Function, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + args: [], + }, + body: { '@type': "FunctionDef.body", + '@role': [Body, Declaration, Function], + 'body_stmts': { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 187, + line: 6, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 205, + line: 6, + col: 49, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 186, + line: 6, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 204, + line: 6, + col: 48, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 205, + line: 6, + col: 49, + }, + end: { '@type': "uast:Position", + offset: 208, + line: 6, + col: 52, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 186, + line: 6, + col: 30, + }, + }, + Name: "request", + }, + ], + }, + }, + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 167, + line: 6, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 177, + line: 6, + col: 21, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 218, + line: 7, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 218, + line: 7, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 225, + line: 7, + col: 8, + }, + }, + Name: "session", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 228, + line: 7, + col: 11, + }, + }, + args: [ + { '@type': "Lambda", + '@role': [Anonymous, Argument, Call, Declaration, Function, Name, Positional, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 239, + line: 7, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 245, + line: 7, + col: 28, + }, + }, + args: { '@type': "arguments", + '@role': [Argument, Declaration, Function, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + args: [], + }, + body: { '@type': "FunctionDef.body", + '@role': [Body, Declaration, Function], + 'body_stmts': { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 248, + line: 7, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 266, + line: 7, + col: 49, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 247, + line: 7, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 265, + line: 7, + col: 48, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 266, + line: 7, + col: 49, + }, + end: { '@type': "uast:Position", + offset: 269, + line: 7, + col: 52, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 247, + line: 7, + col: 30, + }, + }, + Name: "session", + }, + ], + }, + }, + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 228, + line: 7, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 238, + line: 7, + col: 21, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 279, + line: 8, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 279, + line: 8, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 280, + line: 8, + col: 2, + }, + }, + Name: "g", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 283, + line: 8, + col: 5, + }, + }, + args: [ + { '@type': "Lambda", + '@role': [Anonymous, Argument, Call, Declaration, Function, Name, Positional, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 294, + line: 8, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 300, + line: 8, + col: 22, + }, + }, + args: { '@type': "arguments", + '@role': [Argument, Declaration, Function, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + args: [], + }, + body: { '@type': "FunctionDef.body", + '@role': [Body, Declaration, Function], + 'body_stmts': { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 303, + line: 8, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 321, + line: 8, + col: 43, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 302, + line: 8, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 320, + line: 8, + col: 42, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 321, + line: 8, + col: 43, + }, + end: { '@type': "uast:Position", + offset: 324, + line: 8, + col: 46, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 302, + line: 8, + col: 24, + }, + }, + Name: "g", + }, + ], + }, + }, + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 283, + line: 8, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 293, + line: 8, + col: 15, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_16_dst.uast b/uast/diff/testdata/testcase_16_dst.uast new file mode 100644 index 00000000..0c42c446 --- /dev/null +++ b/uast/diff/testdata/testcase_16_dst.uast @@ -0,0 +1,321 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 10, + line: 1, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 25, + line: 3, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 25, + line: 3, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 28, + line: 3, + col: 4, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 31, + line: 3, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 37, + line: 3, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 45, + line: 3, + col: 21, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 31, + line: 3, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 36, + line: 3, + col: 12, + }, + }, + Name: "Flask", + }, + keywords: [], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 47, + line: 4, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "admin", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "blueprintapp.apps.admin", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 89, + line: 5, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "frontend", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "blueprintapp.apps.frontend", + }, + Target: ~, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 137, + line: 6, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 137, + line: 6, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 160, + line: 6, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 165, + line: 6, + col: 29, + }, + }, + Name: "admin", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 138, + line: 6, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 141, + line: 6, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 137, + line: 6, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 140, + line: 6, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 137, + line: 6, + col: 1, + }, + }, + Name: "register_blueprint", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 167, + line: 7, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 167, + line: 7, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 190, + line: 7, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 198, + line: 7, + col: 32, + }, + }, + Name: "frontend", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 168, + line: 7, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 171, + line: 7, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 167, + line: 7, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 170, + line: 7, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 167, + line: 7, + col: 1, + }, + }, + Name: "register_blueprint", + }, + ], + }, + keywords: [], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_16_src.uast b/uast/diff/testdata/testcase_16_src.uast new file mode 100644 index 00000000..852e9402 --- /dev/null +++ b/uast/diff/testdata/testcase_16_src.uast @@ -0,0 +1,321 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 10, + line: 1, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 25, + line: 3, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 25, + line: 3, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 28, + line: 3, + col: 4, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 31, + line: 3, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 37, + line: 3, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 45, + line: 3, + col: 21, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 31, + line: 3, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 36, + line: 3, + col: 12, + }, + }, + Name: "Flask", + }, + keywords: [], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 47, + line: 4, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "admin", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "moduleapp.apps.admin", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 86, + line: 5, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "frontend", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "moduleapp.apps.frontend", + }, + Target: ~, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 131, + line: 6, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 131, + line: 6, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 154, + line: 6, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 159, + line: 6, + col: 29, + }, + }, + Name: "admin", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 132, + line: 6, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 135, + line: 6, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 131, + line: 6, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 134, + line: 6, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 131, + line: 6, + col: 1, + }, + }, + Name: "register_blueprint", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 161, + line: 7, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 161, + line: 7, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 184, + line: 7, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 192, + line: 7, + col: 32, + }, + }, + Name: "frontend", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 162, + line: 7, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 165, + line: 7, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 161, + line: 7, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 164, + line: 7, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 161, + line: 7, + col: 1, + }, + }, + Name: "register_blueprint", + }, + ], + }, + keywords: [], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_17_dst.uast b/uast/diff/testdata/testcase_17_dst.uast new file mode 100644 index 00000000..762f83c7 --- /dev/null +++ b/uast/diff/testdata/testcase_17_dst.uast @@ -0,0 +1,425 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 10, + line: 1, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 25, + line: 3, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 25, + line: 3, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 28, + line: 3, + col: 4, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 31, + line: 3, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 37, + line: 3, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 45, + line: 3, + col: 21, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 31, + line: 3, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 36, + line: 3, + col: 12, + }, + }, + Name: "Flask", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 47, + line: 4, + col: 1, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 47, + line: 4, + col: 1, + }, + }, + ctx: "Store", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 58, + line: 4, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 65, + line: 4, + col: 19, + }, + }, + Format: "", + Value: "DEBUG", + }, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 48, + line: 4, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 51, + line: 4, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 47, + line: 4, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 50, + line: 4, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 47, + line: 4, + col: 1, + }, + }, + Name: "config", + }, + ], + }, + }, + ], + value: { '@type': "BoolLiteral", + '@token': "True", + '@role': [Boolean, Expression, Literal, Primitive, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 69, + line: 4, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 73, + line: 4, + col: 27, + }, + }, + value: true, + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 74, + line: 5, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "admin", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "blueprintapp.apps.admin", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 116, + line: 6, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "frontend", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "blueprintapp.apps.frontend", + }, + Target: ~, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 164, + line: 7, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 164, + line: 7, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 187, + line: 7, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 192, + line: 7, + col: 29, + }, + }, + Name: "admin", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 165, + line: 7, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 168, + line: 7, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 164, + line: 7, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 167, + line: 7, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 164, + line: 7, + col: 1, + }, + }, + Name: "register_blueprint", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 194, + line: 8, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 194, + line: 8, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 217, + line: 8, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 225, + line: 8, + col: 32, + }, + }, + Name: "frontend", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 195, + line: 8, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 198, + line: 8, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 194, + line: 8, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 197, + line: 8, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 194, + line: 8, + col: 1, + }, + }, + Name: "register_blueprint", + }, + ], + }, + keywords: [], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_17_src.uast b/uast/diff/testdata/testcase_17_src.uast new file mode 100644 index 00000000..762f83c7 --- /dev/null +++ b/uast/diff/testdata/testcase_17_src.uast @@ -0,0 +1,425 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 10, + line: 1, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 25, + line: 3, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 25, + line: 3, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 28, + line: 3, + col: 4, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 31, + line: 3, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 37, + line: 3, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 45, + line: 3, + col: 21, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 31, + line: 3, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 36, + line: 3, + col: 12, + }, + }, + Name: "Flask", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 47, + line: 4, + col: 1, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 47, + line: 4, + col: 1, + }, + }, + ctx: "Store", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 58, + line: 4, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 65, + line: 4, + col: 19, + }, + }, + Format: "", + Value: "DEBUG", + }, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 48, + line: 4, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 51, + line: 4, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 47, + line: 4, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 50, + line: 4, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 47, + line: 4, + col: 1, + }, + }, + Name: "config", + }, + ], + }, + }, + ], + value: { '@type': "BoolLiteral", + '@token': "True", + '@role': [Boolean, Expression, Literal, Primitive, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 69, + line: 4, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 73, + line: 4, + col: 27, + }, + }, + value: true, + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 74, + line: 5, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "admin", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "blueprintapp.apps.admin", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 116, + line: 6, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "frontend", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "blueprintapp.apps.frontend", + }, + Target: ~, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 164, + line: 7, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 164, + line: 7, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 187, + line: 7, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 192, + line: 7, + col: 29, + }, + }, + Name: "admin", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 165, + line: 7, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 168, + line: 7, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 164, + line: 7, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 167, + line: 7, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 164, + line: 7, + col: 1, + }, + }, + Name: "register_blueprint", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 194, + line: 8, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 194, + line: 8, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 217, + line: 8, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 225, + line: 8, + col: 32, + }, + }, + Name: "frontend", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 195, + line: 8, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 198, + line: 8, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 194, + line: 8, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 197, + line: 8, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 194, + line: 8, + col: 1, + }, + }, + Name: "register_blueprint", + }, + ], + }, + keywords: [], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_18_dst.uast b/uast/diff/testdata/testcase_18_dst.uast new file mode 100644 index 00000000..4cd61e1b --- /dev/null +++ b/uast/diff/testdata/testcase_18_dst.uast @@ -0,0 +1,251 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 10, + line: 1, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 46, + line: 3, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 46, + line: 3, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 54, + line: 3, + col: 9, + }, + }, + Name: "frontend", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 3, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 67, + line: 3, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 77, + line: 3, + col: 32, + }, + }, + Format: "", + Value: "frontend", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 79, + line: 3, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 87, + line: 3, + col: 42, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 3, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 66, + line: 3, + col: 21, + }, + }, + Name: "Blueprint", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "template_folder", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 105, + line: 3, + col: 60, + }, + end: { '@type': "uast:Position", + offset: 116, + line: 3, + col: 71, + }, + }, + Format: "", + Value: "templates", + }, + }, + ], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 120, + line: 6, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 158, + line: 8, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 164, + line: 8, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 165, + line: 8, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 181, + line: 8, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 202, + line: 8, + col: 49, + }, + }, + Format: "", + Value: "frontend/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 165, + line: 8, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 180, + line: 8, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_18_src.uast b/uast/diff/testdata/testcase_18_src.uast new file mode 100644 index 00000000..cf1dd8fa --- /dev/null +++ b/uast/diff/testdata/testcase_18_src.uast @@ -0,0 +1,208 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 10, + line: 1, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 46, + line: 3, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 46, + line: 3, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 54, + line: 3, + col: 9, + }, + }, + Name: "frontend", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 3, + col: 12, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 67, + line: 3, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 75, + line: 3, + col: 30, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 3, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 66, + line: 3, + col: 21, + }, + }, + Name: "Blueprint", + }, + keywords: [], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 79, + line: 6, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 117, + line: 8, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 123, + line: 8, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 124, + line: 8, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 140, + line: 8, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 161, + line: 8, + col: 49, + }, + }, + Format: "", + Value: "frontend/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 124, + line: 8, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 139, + line: 8, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_19_dst.uast b/uast/diff/testdata/testcase_19_dst.uast new file mode 100644 index 00000000..f2f9dffc --- /dev/null +++ b/uast/diff/testdata/testcase_19_dst.uast @@ -0,0 +1,325 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 10, + line: 1, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 44, + line: 4, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 44, + line: 4, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 49, + line: 4, + col: 6, + }, + }, + Name: "admin", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 52, + line: 4, + col: 9, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 59, + line: 4, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 67, + line: 4, + col: 24, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 52, + line: 4, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 58, + line: 4, + col: 15, + }, + }, + Name: "Module", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "url_prefix", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 80, + line: 4, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 88, + line: 4, + col: 45, + }, + }, + Format: "", + Value: "/admin", + }, + }, + ], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 92, + line: 7, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 127, + line: 9, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 133, + line: 9, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 134, + line: 9, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 150, + line: 9, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 168, + line: 9, + col: 46, + }, + }, + Format: "", + Value: "admin/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 134, + line: 9, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 149, + line: 9, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 172, + line: 12, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index2", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 214, + line: 14, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 220, + line: 14, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 221, + line: 14, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 237, + line: 14, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 257, + line: 14, + col: 48, + }, + }, + Format: "", + Value: "./admin/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 221, + line: 14, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 236, + line: 14, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_19_src.uast b/uast/diff/testdata/testcase_19_src.uast new file mode 100644 index 00000000..9e4790ed --- /dev/null +++ b/uast/diff/testdata/testcase_19_src.uast @@ -0,0 +1,234 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 10, + line: 1, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 44, + line: 4, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 44, + line: 4, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 49, + line: 4, + col: 6, + }, + }, + Name: "admin", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 52, + line: 4, + col: 9, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 59, + line: 4, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 67, + line: 4, + col: 24, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 52, + line: 4, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 58, + line: 4, + col: 15, + }, + }, + Name: "Module", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "url_prefix", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 80, + line: 4, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 88, + line: 4, + col: 45, + }, + }, + Format: "", + Value: "/admin", + }, + }, + ], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 92, + line: 7, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 127, + line: 9, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 133, + line: 9, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 134, + line: 9, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 150, + line: 9, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 168, + line: 9, + col: 46, + }, + }, + Format: "", + Value: "admin/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 134, + line: 9, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 149, + line: 9, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_1_dst.uast b/uast/diff/testdata/testcase_1_dst.uast new file mode 100644 index 00000000..4c15dc9b --- /dev/null +++ b/uast/diff/testdata/testcase_1_dst.uast @@ -0,0 +1,69 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 22, + line: 2, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "main", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.testsuite", + }, + Target: ~, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 55, + line: 3, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 55, + line: 3, + col: 1, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 55, + line: 3, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 59, + line: 3, + col: 5, + }, + }, + Name: "main", + }, + keywords: [], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_1_src.uast b/uast/diff/testdata/testcase_1_src.uast new file mode 100644 index 00000000..ba157e75 --- /dev/null +++ b/uast/diff/testdata/testcase_1_src.uast @@ -0,0 +1,69 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "main", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.testsuite", + }, + Target: ~, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 33, + line: 2, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 33, + line: 2, + col: 1, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 33, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 37, + line: 2, + col: 5, + }, + }, + Name: "main", + }, + keywords: [], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_20_dst.uast b/uast/diff/testdata/testcase_20_dst.uast new file mode 100644 index 00000000..dcea5f8e --- /dev/null +++ b/uast/diff/testdata/testcase_20_dst.uast @@ -0,0 +1,323 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 10, + line: 1, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "simple_page", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "simple_page.simple_page", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 73, + line: 4, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 73, + line: 4, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 76, + line: 4, + col: 4, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 79, + line: 4, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 85, + line: 4, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 93, + line: 4, + col: 21, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 79, + line: 4, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 84, + line: 4, + col: 12, + }, + }, + Name: "Flask", + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 95, + line: 5, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 95, + line: 5, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 118, + line: 5, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 129, + line: 5, + col: 35, + }, + }, + Name: "simple_page", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 96, + line: 5, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 99, + line: 5, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 95, + line: 5, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 98, + line: 5, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 95, + line: 5, + col: 1, + }, + }, + Name: "register_blueprint", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 172, + line: 7, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 172, + line: 7, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 195, + line: 7, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 206, + line: 7, + col: 35, + }, + }, + Name: "simple_page", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 173, + line: 7, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 176, + line: 7, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 172, + line: 7, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 175, + line: 7, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 172, + line: 7, + col: 1, + }, + }, + Name: "register_blueprint", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "url_prefix", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 219, + line: 7, + col: 48, + }, + end: { '@type': "uast:Position", + offset: 227, + line: 7, + col: 56, + }, + }, + Format: "", + Value: "/pages", + }, + }, + ], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_20_src.uast b/uast/diff/testdata/testcase_20_src.uast new file mode 100644 index 00000000..58ffeb04 --- /dev/null +++ b/uast/diff/testdata/testcase_20_src.uast @@ -0,0 +1,498 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 10, + line: 1, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "simple_page", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "simple_page.simple_page", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 73, + line: 4, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 73, + line: 4, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 76, + line: 4, + col: 4, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 79, + line: 4, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 85, + line: 4, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 93, + line: 4, + col: 21, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 79, + line: 4, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 84, + line: 4, + col: 12, + }, + }, + Name: "Flask", + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 95, + line: 5, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 95, + line: 5, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 118, + line: 5, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 129, + line: 5, + col: 35, + }, + }, + Name: "simple_page", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 96, + line: 5, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 99, + line: 5, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 95, + line: 5, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 98, + line: 5, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 95, + line: 5, + col: 1, + }, + }, + Name: "register_blueprint", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 172, + line: 7, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 172, + line: 7, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 195, + line: 7, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 206, + line: 7, + col: 35, + }, + }, + Name: "simple_page", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 173, + line: 7, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 176, + line: 7, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 172, + line: 7, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 175, + line: 7, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 172, + line: 7, + col: 1, + }, + }, + Name: "register_blueprint", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "url_prefix", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 219, + line: 7, + col: 48, + }, + end: { '@type': "uast:Position", + offset: 227, + line: 7, + col: 56, + }, + }, + Format: "", + Value: "/pages", + }, + }, + ], + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 232, + line: 10, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 234, + line: 10, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 263, + line: 11, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 263, + line: 11, + col: 5, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 264, + line: 11, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 267, + line: 11, + col: 9, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 263, + line: 11, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 266, + line: 11, + col: 8, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 263, + line: 11, + col: 5, + }, + }, + Name: "run", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "debug", + }, + value: { '@type': "BoolLiteral", + '@token': "True", + '@role': [Argument, Boolean, Expression, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 277, + line: 11, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 281, + line: 11, + col: 23, + }, + }, + value: true, + }, + }, + ], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 235, + line: 10, + col: 4, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 247, + line: 10, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 257, + line: 10, + col: 26, + }, + }, + Format: "", + Value: "__main__", + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 235, + line: 10, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 243, + line: 10, + col: 12, + }, + }, + Name: "__name__", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_21_dst.uast b/uast/diff/testdata/testcase_21_dst.uast new file mode 100644 index 00000000..252a6453 --- /dev/null +++ b/uast/diff/testdata/testcase_21_dst.uast @@ -0,0 +1,472 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 10, + line: 1, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "simple_page", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "simple_page.simple_page", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 73, + line: 4, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 73, + line: 4, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 76, + line: 4, + col: 4, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 79, + line: 4, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 85, + line: 4, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 93, + line: 4, + col: 21, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 79, + line: 4, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 84, + line: 4, + col: 12, + }, + }, + Name: "Flask", + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 95, + line: 5, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 95, + line: 5, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 118, + line: 5, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 129, + line: 5, + col: 35, + }, + }, + Name: "simple_page", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 96, + line: 5, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 99, + line: 5, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 95, + line: 5, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 98, + line: 5, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 95, + line: 5, + col: 1, + }, + }, + Name: "register_blueprint", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 172, + line: 7, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 172, + line: 7, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 195, + line: 7, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 206, + line: 7, + col: 35, + }, + }, + Name: "simple_page", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 173, + line: 7, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 176, + line: 7, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 172, + line: 7, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 175, + line: 7, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 172, + line: 7, + col: 1, + }, + }, + Name: "register_blueprint", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "url_prefix", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 219, + line: 7, + col: 48, + }, + end: { '@type': "uast:Position", + offset: 227, + line: 7, + col: 56, + }, + }, + Format: "", + Value: "/pages", + }, + }, + ], + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 230, + line: 9, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 232, + line: 9, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 10, + col: 3, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 10, + col: 3, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 258, + line: 10, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 261, + line: 10, + col: 7, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 10, + col: 3, + }, + end: { '@type': "uast:Position", + offset: 260, + line: 10, + col: 6, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 10, + col: 3, + }, + }, + Name: "run", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 233, + line: 9, + col: 4, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 243, + line: 9, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 253, + line: 9, + col: 24, + }, + }, + Format: "", + Value: "__main__", + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 233, + line: 9, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 241, + line: 9, + col: 12, + }, + }, + Name: "__name__", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_21_src.uast b/uast/diff/testdata/testcase_21_src.uast new file mode 100644 index 00000000..dcea5f8e --- /dev/null +++ b/uast/diff/testdata/testcase_21_src.uast @@ -0,0 +1,323 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 10, + line: 1, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "simple_page", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "simple_page.simple_page", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 73, + line: 4, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 73, + line: 4, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 76, + line: 4, + col: 4, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 79, + line: 4, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 85, + line: 4, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 93, + line: 4, + col: 21, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 79, + line: 4, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 84, + line: 4, + col: 12, + }, + }, + Name: "Flask", + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 95, + line: 5, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 95, + line: 5, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 118, + line: 5, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 129, + line: 5, + col: 35, + }, + }, + Name: "simple_page", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 96, + line: 5, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 99, + line: 5, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 95, + line: 5, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 98, + line: 5, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 95, + line: 5, + col: 1, + }, + }, + Name: "register_blueprint", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 172, + line: 7, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 172, + line: 7, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 195, + line: 7, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 206, + line: 7, + col: 35, + }, + }, + Name: "simple_page", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 173, + line: 7, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 176, + line: 7, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 172, + line: 7, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 175, + line: 7, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 172, + line: 7, + col: 1, + }, + }, + Name: "register_blueprint", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "url_prefix", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 219, + line: 7, + col: 48, + }, + end: { '@type': "uast:Position", + offset: 227, + line: 7, + col: 56, + }, + }, + Format: "", + Value: "/pages", + }, + }, + ], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_22_dst.uast b/uast/diff/testdata/testcase_22_dst.uast new file mode 100644 index 00000000..c4d9c2af --- /dev/null +++ b/uast/diff/testdata/testcase_22_dst.uast @@ -0,0 +1,1996 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 220, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 223, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n tests.deprecations\n ~~~~~~~~~~~~~~~~~~\n\n Tests deprecation support. Not used currently.\n\n :copyright: (c) 2014 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 225, + line: 12, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "pytest", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 224, + line: 11, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 224, + line: 11, + col: 1, + }, + }, + lines: [], + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 240, + line: 14, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flask", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 239, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 239, + line: 13, + col: 1, + }, + }, + lines: [], + }, + }, + { '@type': "ClassDef", + '@token': "TestRequestDeprecation", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 261, + line: 17, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 283, + line: 17, + col: 29, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 284, + line: 17, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 290, + line: 17, + col: 36, + }, + }, + Name: "object", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 302, + line: 19, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 319, + line: 19, + col: 26, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "test_request_json", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 363, + line: 20, + col: 9, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 363, + line: 20, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 395, + line: 20, + col: 41, + }, + }, + Format: "", + Value: "Request.json is deprecated", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 404, + line: 21, + col: 9, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 404, + line: 21, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 407, + line: 21, + col: 12, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 410, + line: 21, + col: 15, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 422, + line: 21, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 430, + line: 21, + col: 35, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 411, + line: 21, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 416, + line: 21, + col: 21, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 410, + line: 21, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 415, + line: 21, + col: 20, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 410, + line: 21, + col: 15, + }, + }, + Name: "Flask", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 440, + line: 22, + col: 9, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 441, + line: 22, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 444, + line: 22, + col: 13, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 440, + line: 22, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 443, + line: 22, + col: 12, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 440, + line: 22, + col: 9, + }, + }, + Name: "testing", + }, + ], + }, + ], + value: { '@type': "BoolLiteral", + '@token': "True", + '@role': [Boolean, Expression, Literal, Primitive, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 454, + line: 22, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 458, + line: 22, + col: 27, + }, + }, + value: true, + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 468, + line: 24, + col: 9, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 535, + line: 26, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 541, + line: 26, + col: 19, + }, + }, + msg: ~, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 542, + line: 26, + col: 20, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "Dict", + '@role': [Expression, Literal, Map, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 564, + line: 26, + col: 42, + }, + }, + keys: [ + { '@type': "uast:String", + '@role': [Key, Map], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 565, + line: 26, + col: 43, + }, + end: { '@type': "uast:Position", + offset: 571, + line: 26, + col: 49, + }, + }, + Format: "", + Value: "spam", + }, + ], + values: [ + { '@type': "Num", + '@token': 42, + '@role': [Expression, Literal, Map, Number, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 573, + line: 26, + col: 51, + }, + end: { '@type': "uast:Position", + offset: 575, + line: 26, + col: 53, + }, + }, + }, + ], + }, + ], + }, + left: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 543, + line: 26, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 548, + line: 26, + col: 26, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 542, + line: 26, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 547, + line: 26, + col: 25, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 548, + line: 26, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 555, + line: 26, + col: 33, + }, + }, + Name: "request", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 542, + line: 26, + col: 20, + }, + }, + Name: "json", + }, + ], + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 589, + line: 27, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 589, + line: 27, + col: 13, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 596, + line: 27, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 601, + line: 27, + col: 25, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 595, + line: 27, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 600, + line: 27, + col: 24, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 601, + line: 27, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 608, + line: 27, + col: 32, + }, + }, + Name: "request", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 595, + line: 27, + col: 19, + }, + }, + Name: "json", + }, + ], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 589, + line: 27, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 594, + line: 27, + col: 18, + }, + }, + Name: "print", + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 627, + line: 28, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 633, + line: 28, + col: 19, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 634, + line: 28, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 638, + line: 28, + col: 24, + }, + }, + Format: "", + Value: "OK", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "With", + '@token': "with", + '@role': [Block, Scope, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 648, + line: 30, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 652, + line: 30, + col: 13, + }, + }, + body: { '@type': "With.body", + '@role': [Block, Body, Incomplete, Scope], + 'body_stmts': [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 707, + line: 31, + col: 13, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 707, + line: 31, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 708, + line: 31, + col: 14, + }, + }, + Name: "c", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 711, + line: 31, + col: 17, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 712, + line: 31, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 715, + line: 31, + col: 21, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 711, + line: 31, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 714, + line: 31, + col: 20, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 711, + line: 31, + col: 17, + }, + }, + Name: "test_client", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 741, + line: 32, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 741, + line: 32, + col: 13, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 748, + line: 32, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 751, + line: 32, + col: 23, + }, + }, + Format: "", + Value: "/", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 742, + line: 32, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 743, + line: 32, + col: 15, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 741, + line: 32, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 742, + line: 32, + col: 14, + }, + }, + Name: "c", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 741, + line: 32, + col: 13, + }, + }, + Name: "post", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "data", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 758, + line: 32, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 772, + line: 32, + col: 44, + }, + }, + Format: "", + Value: "{\"spam\": 42}", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "content_type", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 787, + line: 32, + col: 59, + }, + end: { '@type': "uast:Position", + offset: 805, + line: 32, + col: 77, + }, + }, + Format: "", + Value: "application/json", + }, + }, + ], + }, + }, + ], + }, + items: { '@type': "With.items", + '@role': [Block, Incomplete, Scope], + items: [ + { '@type': "withitem", + '@role': [Expression, Identifier, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + 'context_expr': { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 653, + line: 30, + col: 14, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 653, + line: 30, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 679, + line: 30, + col: 40, + }, + }, + Name: "catch_deprecation_warnings", + }, + keywords: [], + }, + 'optional_vars': { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 685, + line: 30, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 693, + line: 30, + col: 54, + }, + }, + Name: "captured", + }, + }, + ], + }, + }, + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 816, + line: 34, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 822, + line: 34, + col: 15, + }, + }, + msg: ~, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 823, + line: 34, + col: 16, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "Num", + '@token': 1, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 840, + line: 34, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 841, + line: 34, + col: 34, + }, + }, + }, + ], + }, + left: { '@type': "Call", + '@role': [Call, Expression, Function, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 823, + line: 34, + col: 16, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 827, + line: 34, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 835, + line: 34, + col: 28, + }, + }, + Name: "captured", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 823, + line: 34, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 826, + line: 34, + col: 19, + }, + }, + Name: "len", + }, + keywords: [], + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 320, + line: 19, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 324, + line: 19, + col: 31, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 320, + line: 19, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 324, + line: 19, + col: 31, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 326, + line: 19, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 352, + line: 19, + col: 59, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 326, + line: 19, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 352, + line: 19, + col: 59, + }, + }, + Name: "catch_deprecation_warnings", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 851, + line: 36, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 870, + line: 36, + col: 28, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "test_request_module", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 914, + line: 37, + col: 9, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 914, + line: 37, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 948, + line: 37, + col: 43, + }, + }, + Format: "", + Value: "Request.module is deprecated", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 957, + line: 38, + col: 9, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 957, + line: 38, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 960, + line: 38, + col: 12, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 963, + line: 38, + col: 15, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 975, + line: 38, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 983, + line: 38, + col: 35, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 964, + line: 38, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 969, + line: 38, + col: 21, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 963, + line: 38, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 968, + line: 38, + col: 20, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 963, + line: 38, + col: 15, + }, + }, + Name: "Flask", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 993, + line: 39, + col: 9, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 994, + line: 39, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 997, + line: 39, + col: 13, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 993, + line: 39, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 996, + line: 39, + col: 12, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 993, + line: 39, + col: 9, + }, + }, + Name: "testing", + }, + ], + }, + ], + value: { '@type': "BoolLiteral", + '@token': "True", + '@role': [Boolean, Expression, Literal, Primitive, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1007, + line: 39, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 1011, + line: 39, + col: 27, + }, + }, + value: true, + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1021, + line: 41, + col: 9, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1070, + line: 43, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1076, + line: 43, + col: 19, + }, + }, + msg: ~, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1077, + line: 43, + col: 20, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1101, + line: 43, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 1105, + line: 43, + col: 48, + }, + }, + LiteralValue: "None", + value: ~, + }, + ], + }, + left: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1078, + line: 43, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 1083, + line: 43, + col: 26, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1077, + line: 43, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 1082, + line: 43, + col: 25, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1083, + line: 43, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 1090, + line: 43, + col: 33, + }, + }, + Name: "request", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1077, + line: 43, + col: 20, + }, + }, + Name: "module", + }, + ], + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Is", + '@token': "is", + '@role': [Identical, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1118, + line: 44, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1124, + line: 44, + col: 19, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1125, + line: 44, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 1129, + line: 44, + col: 24, + }, + }, + Format: "", + Value: "OK", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "With", + '@token': "with", + '@role': [Block, Scope, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1139, + line: 46, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1143, + line: 46, + col: 13, + }, + }, + body: { '@type': "With.body", + '@role': [Block, Body, Incomplete, Scope], + 'body_stmts': [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1198, + line: 47, + col: 13, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1198, + line: 47, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1199, + line: 47, + col: 14, + }, + }, + Name: "c", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1202, + line: 47, + col: 17, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1203, + line: 47, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 1206, + line: 47, + col: 21, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1202, + line: 47, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 1205, + line: 47, + col: 20, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1202, + line: 47, + col: 17, + }, + }, + Name: "test_client", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1232, + line: 48, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1232, + line: 48, + col: 13, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1238, + line: 48, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 1241, + line: 48, + col: 22, + }, + }, + Format: "", + Value: "/", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1233, + line: 48, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 1234, + line: 48, + col: 15, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1232, + line: 48, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1233, + line: 48, + col: 14, + }, + }, + Name: "c", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1232, + line: 48, + col: 13, + }, + }, + Name: "get", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + items: { '@type': "With.items", + '@role': [Block, Incomplete, Scope], + items: [ + { '@type': "withitem", + '@role': [Expression, Identifier, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + 'context_expr': { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1144, + line: 46, + col: 14, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1144, + line: 46, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 1170, + line: 46, + col: 40, + }, + }, + Name: "catch_deprecation_warnings", + }, + keywords: [], + }, + 'optional_vars': { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1176, + line: 46, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 1184, + line: 46, + col: 54, + }, + }, + Name: "captured", + }, + }, + ], + }, + }, + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1252, + line: 50, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1258, + line: 50, + col: 15, + }, + }, + msg: ~, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1259, + line: 50, + col: 16, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "Num", + '@token': 1, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1276, + line: 50, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 1277, + line: 50, + col: 34, + }, + }, + }, + ], + }, + left: { '@type': "Call", + '@role': [Call, Expression, Function, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1259, + line: 50, + col: 16, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1263, + line: 50, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 1271, + line: 50, + col: 28, + }, + }, + Name: "captured", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1259, + line: 50, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 1262, + line: 50, + col: 19, + }, + }, + Name: "len", + }, + keywords: [], + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 871, + line: 36, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 875, + line: 36, + col: 33, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 871, + line: 36, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 875, + line: 36, + col: 33, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 877, + line: 36, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 903, + line: 36, + col: 61, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 877, + line: 36, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 903, + line: 36, + col: 61, + }, + }, + Name: "catch_deprecation_warnings", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_22_src.uast b/uast/diff/testdata/testcase_22_src.uast new file mode 100644 index 00000000..a72025ea --- /dev/null +++ b/uast/diff/testdata/testcase_22_src.uast @@ -0,0 +1,33 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 220, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 223, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n tests.deprecations\n ~~~~~~~~~~~~~~~~~~\n\n Tests deprecation support. Not used currently.\n\n :copyright: (c) 2014 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_23_dst.uast b/uast/diff/testdata/testcase_23_dst.uast new file mode 100644 index 00000000..cca08a32 --- /dev/null +++ b/uast/diff/testdata/testcase_23_dst.uast @@ -0,0 +1,342 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 10, + line: 1, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 46, + line: 3, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 46, + line: 3, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 54, + line: 3, + col: 9, + }, + }, + Name: "frontend", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 3, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 67, + line: 3, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 77, + line: 3, + col: 32, + }, + }, + Format: "", + Value: "frontend", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 79, + line: 3, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 87, + line: 3, + col: 42, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 3, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 66, + line: 3, + col: 21, + }, + }, + Name: "Blueprint", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "template_folder", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 105, + line: 3, + col: 60, + }, + end: { '@type': "uast:Position", + offset: 116, + line: 3, + col: 71, + }, + }, + Format: "", + Value: "templates", + }, + }, + ], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 120, + line: 6, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 158, + line: 8, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 164, + line: 8, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 165, + line: 8, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 181, + line: 8, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 202, + line: 8, + col: 49, + }, + }, + Format: "", + Value: "frontend/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 165, + line: 8, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 180, + line: 8, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 206, + line: 11, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "missing_template", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 262, + line: 13, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 13, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 269, + line: 13, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 285, + line: 13, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 308, + line: 13, + col: 51, + }, + }, + Format: "", + Value: "missing_template.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 269, + line: 13, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 284, + line: 13, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_23_src.uast b/uast/diff/testdata/testcase_23_src.uast new file mode 100644 index 00000000..cca08a32 --- /dev/null +++ b/uast/diff/testdata/testcase_23_src.uast @@ -0,0 +1,342 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 10, + line: 1, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 46, + line: 3, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 46, + line: 3, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 54, + line: 3, + col: 9, + }, + }, + Name: "frontend", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 3, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 67, + line: 3, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 77, + line: 3, + col: 32, + }, + }, + Format: "", + Value: "frontend", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 79, + line: 3, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 87, + line: 3, + col: 42, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 3, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 66, + line: 3, + col: 21, + }, + }, + Name: "Blueprint", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "template_folder", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 105, + line: 3, + col: 60, + }, + end: { '@type': "uast:Position", + offset: 116, + line: 3, + col: 71, + }, + }, + Format: "", + Value: "templates", + }, + }, + ], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 120, + line: 6, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 158, + line: 8, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 164, + line: 8, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 165, + line: 8, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 181, + line: 8, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 202, + line: 8, + col: 49, + }, + }, + Format: "", + Value: "frontend/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 165, + line: 8, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 180, + line: 8, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 206, + line: 11, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "missing_template", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 262, + line: 13, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 13, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 269, + line: 13, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 285, + line: 13, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 308, + line: 13, + col: 51, + }, + }, + Format: "", + Value: "missing_template.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 269, + line: 13, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 284, + line: 13, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_24_dst.uast b/uast/diff/testdata/testcase_24_dst.uast new file mode 100644 index 00000000..9949914d --- /dev/null +++ b/uast/diff/testdata/testcase_24_dst.uast @@ -0,0 +1,392 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 10, + line: 1, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 46, + line: 3, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 46, + line: 3, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 51, + line: 3, + col: 6, + }, + }, + Name: "admin", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 54, + line: 3, + col: 9, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 64, + line: 3, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 71, + line: 3, + col: 26, + }, + }, + Format: "", + Value: "admin", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 73, + line: 3, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 81, + line: 3, + col: 36, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 54, + line: 3, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 63, + line: 3, + col: 18, + }, + }, + Name: "Blueprint", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "url_prefix", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 94, + line: 3, + col: 49, + }, + end: { '@type': "uast:Position", + offset: 102, + line: 3, + col: 57, + }, + }, + Format: "", + Value: "/admin", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "template_folder", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 138, + line: 4, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 149, + line: 4, + col: 46, + }, + }, + Format: "", + Value: "templates", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "static_folder", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 183, + line: 5, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 191, + line: 5, + col: 41, + }, + }, + Format: "", + Value: "static", + }, + }, + ], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 195, + line: 8, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 230, + line: 10, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 236, + line: 10, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 237, + line: 10, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 253, + line: 10, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 271, + line: 10, + col: 46, + }, + }, + Format: "", + Value: "admin/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 237, + line: 10, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 252, + line: 10, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 275, + line: 13, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index2", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 317, + line: 15, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 323, + line: 15, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 324, + line: 15, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 340, + line: 15, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 360, + line: 15, + col: 48, + }, + }, + Format: "", + Value: "./admin/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 324, + line: 15, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 339, + line: 15, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_24_src.uast b/uast/diff/testdata/testcase_24_src.uast new file mode 100644 index 00000000..a9d72176 --- /dev/null +++ b/uast/diff/testdata/testcase_24_src.uast @@ -0,0 +1,325 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 10, + line: 1, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 46, + line: 3, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 46, + line: 3, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 51, + line: 3, + col: 6, + }, + }, + Name: "admin", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 54, + line: 3, + col: 9, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 64, + line: 3, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 72, + line: 3, + col: 27, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 54, + line: 3, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 63, + line: 3, + col: 18, + }, + }, + Name: "Blueprint", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "url_prefix", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 85, + line: 3, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 93, + line: 3, + col: 48, + }, + }, + Format: "", + Value: "/admin", + }, + }, + ], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 97, + line: 6, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 132, + line: 8, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 138, + line: 8, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 139, + line: 8, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 155, + line: 8, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 173, + line: 8, + col: 46, + }, + }, + Format: "", + Value: "admin/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 139, + line: 8, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 154, + line: 8, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 177, + line: 11, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index2", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 219, + line: 13, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 225, + line: 13, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 226, + line: 13, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 242, + line: 13, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 262, + line: 13, + col: 48, + }, + }, + Format: "", + Value: "./admin/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 226, + line: 13, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 241, + line: 13, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_25_dst.uast b/uast/diff/testdata/testcase_25_dst.uast new file mode 100644 index 00000000..f2f9dffc --- /dev/null +++ b/uast/diff/testdata/testcase_25_dst.uast @@ -0,0 +1,325 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 10, + line: 1, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 44, + line: 4, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 44, + line: 4, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 49, + line: 4, + col: 6, + }, + }, + Name: "admin", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 52, + line: 4, + col: 9, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 59, + line: 4, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 67, + line: 4, + col: 24, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 52, + line: 4, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 58, + line: 4, + col: 15, + }, + }, + Name: "Module", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "url_prefix", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 80, + line: 4, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 88, + line: 4, + col: 45, + }, + }, + Format: "", + Value: "/admin", + }, + }, + ], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 92, + line: 7, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 127, + line: 9, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 133, + line: 9, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 134, + line: 9, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 150, + line: 9, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 168, + line: 9, + col: 46, + }, + }, + Format: "", + Value: "admin/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 134, + line: 9, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 149, + line: 9, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 172, + line: 12, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index2", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 214, + line: 14, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 220, + line: 14, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 221, + line: 14, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 237, + line: 14, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 257, + line: 14, + col: 48, + }, + }, + Format: "", + Value: "./admin/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 221, + line: 14, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 236, + line: 14, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_25_src.uast b/uast/diff/testdata/testcase_25_src.uast new file mode 100644 index 00000000..9e4790ed --- /dev/null +++ b/uast/diff/testdata/testcase_25_src.uast @@ -0,0 +1,234 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 10, + line: 1, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 44, + line: 4, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 44, + line: 4, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 49, + line: 4, + col: 6, + }, + }, + Name: "admin", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 52, + line: 4, + col: 9, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 59, + line: 4, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 67, + line: 4, + col: 24, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 52, + line: 4, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 58, + line: 4, + col: 15, + }, + }, + Name: "Module", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "url_prefix", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 80, + line: 4, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 88, + line: 4, + col: 45, + }, + }, + Format: "", + Value: "/admin", + }, + }, + ], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 92, + line: 7, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 127, + line: 9, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 133, + line: 9, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 134, + line: 9, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 150, + line: 9, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 168, + line: 9, + col: 46, + }, + }, + Format: "", + Value: "admin/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 134, + line: 9, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 149, + line: 9, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_26_dst.uast b/uast/diff/testdata/testcase_26_dst.uast new file mode 100644 index 00000000..ba81ec71 --- /dev/null +++ b/uast/diff/testdata/testcase_26_dst.uast @@ -0,0 +1,210 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 207, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 210, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n flask.__main__\n ~~~~~~~~~~~~~~\n\n Alias for flask.run for the command line.\n\n :copyright: (c) 2014 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 213, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 215, + line: 13, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 244, + line: 14, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 252, + line: 14, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "main", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "cli", + }, + Target: ~, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 269, + line: 15, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 269, + line: 15, + col: 5, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 269, + line: 15, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 273, + line: 15, + col: 9, + }, + }, + Name: "main", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "as_module", + }, + value: { '@type': "BoolLiteral", + '@token': "True", + '@role': [Argument, Boolean, Expression, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 284, + line: 15, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 288, + line: 15, + col: 24, + }, + }, + value: true, + }, + }, + ], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 216, + line: 13, + col: 4, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 228, + line: 13, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 238, + line: 13, + col: 26, + }, + }, + Format: "", + Value: "__main__", + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 216, + line: 13, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 224, + line: 13, + col: 12, + }, + }, + Name: "__name__", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_26_src.uast b/uast/diff/testdata/testcase_26_src.uast new file mode 100644 index 00000000..498d7101 --- /dev/null +++ b/uast/diff/testdata/testcase_26_src.uast @@ -0,0 +1,210 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 207, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 210, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n flask.__main__\n ~~~~~~~~~~~~~~\n\n Alias for flask.run for the command line.\n\n :copyright: (c) 2014 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 213, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 215, + line: 13, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 244, + line: 14, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 252, + line: 14, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "main", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "run", + }, + Target: ~, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 269, + line: 15, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 269, + line: 15, + col: 5, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 269, + line: 15, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 273, + line: 15, + col: 9, + }, + }, + Name: "main", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "as_module", + }, + value: { '@type': "BoolLiteral", + '@token': "True", + '@role': [Argument, Boolean, Expression, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 284, + line: 15, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 288, + line: 15, + col: 24, + }, + }, + value: true, + }, + }, + ], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 216, + line: 13, + col: 4, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 228, + line: 13, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 238, + line: 13, + col: 26, + }, + }, + Format: "", + Value: "__main__", + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 216, + line: 13, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 224, + line: 13, + col: 12, + }, + }, + Name: "__name__", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_27_dst.uast b/uast/diff/testdata/testcase_27_dst.uast new file mode 100644 index 00000000..19d7aea6 --- /dev/null +++ b/uast/diff/testdata/testcase_27_dst.uast @@ -0,0 +1,210 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 207, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 210, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n flask.__main__\n ~~~~~~~~~~~~~~\n\n Alias for flask.run for the command line.\n\n :copyright: (c) 2014 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 213, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 215, + line: 13, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 244, + line: 14, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 253, + line: 14, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "main", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../cli", + }, + Target: ~, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 270, + line: 15, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 270, + line: 15, + col: 5, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 270, + line: 15, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 274, + line: 15, + col: 9, + }, + }, + Name: "main", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "as_module", + }, + value: { '@type': "BoolLiteral", + '@token': "True", + '@role': [Argument, Boolean, Expression, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 285, + line: 15, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 289, + line: 15, + col: 24, + }, + }, + value: true, + }, + }, + ], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 216, + line: 13, + col: 4, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 228, + line: 13, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 238, + line: 13, + col: 26, + }, + }, + Format: "", + Value: "__main__", + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 216, + line: 13, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 224, + line: 13, + col: 12, + }, + }, + Name: "__name__", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_27_src.uast b/uast/diff/testdata/testcase_27_src.uast new file mode 100644 index 00000000..ba81ec71 --- /dev/null +++ b/uast/diff/testdata/testcase_27_src.uast @@ -0,0 +1,210 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 207, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 210, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n flask.__main__\n ~~~~~~~~~~~~~~\n\n Alias for flask.run for the command line.\n\n :copyright: (c) 2014 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 213, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 215, + line: 13, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 244, + line: 14, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 252, + line: 14, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "main", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "cli", + }, + Target: ~, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 269, + line: 15, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 269, + line: 15, + col: 5, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 269, + line: 15, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 273, + line: 15, + col: 9, + }, + }, + Name: "main", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "as_module", + }, + value: { '@type': "BoolLiteral", + '@token': "True", + '@role': [Argument, Boolean, Expression, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 284, + line: 15, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 288, + line: 15, + col: 24, + }, + }, + value: true, + }, + }, + ], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 216, + line: 13, + col: 4, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 228, + line: 13, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 238, + line: 13, + col: 26, + }, + }, + Format: "", + Value: "__main__", + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 216, + line: 13, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 224, + line: 13, + col: 12, + }, + }, + Name: "__name__", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_28_dst.uast b/uast/diff/testdata/testcase_28_dst.uast new file mode 100644 index 00000000..9949914d --- /dev/null +++ b/uast/diff/testdata/testcase_28_dst.uast @@ -0,0 +1,392 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 10, + line: 1, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 46, + line: 3, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 46, + line: 3, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 51, + line: 3, + col: 6, + }, + }, + Name: "admin", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 54, + line: 3, + col: 9, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 64, + line: 3, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 71, + line: 3, + col: 26, + }, + }, + Format: "", + Value: "admin", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 73, + line: 3, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 81, + line: 3, + col: 36, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 54, + line: 3, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 63, + line: 3, + col: 18, + }, + }, + Name: "Blueprint", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "url_prefix", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 94, + line: 3, + col: 49, + }, + end: { '@type': "uast:Position", + offset: 102, + line: 3, + col: 57, + }, + }, + Format: "", + Value: "/admin", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "template_folder", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 138, + line: 4, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 149, + line: 4, + col: 46, + }, + }, + Format: "", + Value: "templates", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "static_folder", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 183, + line: 5, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 191, + line: 5, + col: 41, + }, + }, + Format: "", + Value: "static", + }, + }, + ], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 195, + line: 8, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 230, + line: 10, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 236, + line: 10, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 237, + line: 10, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 253, + line: 10, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 271, + line: 10, + col: 46, + }, + }, + Format: "", + Value: "admin/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 237, + line: 10, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 252, + line: 10, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 275, + line: 13, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index2", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 317, + line: 15, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 323, + line: 15, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 324, + line: 15, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 340, + line: 15, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 360, + line: 15, + col: 48, + }, + }, + Format: "", + Value: "./admin/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 324, + line: 15, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 339, + line: 15, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_28_src.uast b/uast/diff/testdata/testcase_28_src.uast new file mode 100644 index 00000000..9949914d --- /dev/null +++ b/uast/diff/testdata/testcase_28_src.uast @@ -0,0 +1,392 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 10, + line: 1, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 46, + line: 3, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 46, + line: 3, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 51, + line: 3, + col: 6, + }, + }, + Name: "admin", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 54, + line: 3, + col: 9, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 64, + line: 3, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 71, + line: 3, + col: 26, + }, + }, + Format: "", + Value: "admin", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 73, + line: 3, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 81, + line: 3, + col: 36, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 54, + line: 3, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 63, + line: 3, + col: 18, + }, + }, + Name: "Blueprint", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "url_prefix", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 94, + line: 3, + col: 49, + }, + end: { '@type': "uast:Position", + offset: 102, + line: 3, + col: 57, + }, + }, + Format: "", + Value: "/admin", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "template_folder", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 138, + line: 4, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 149, + line: 4, + col: 46, + }, + }, + Format: "", + Value: "templates", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "static_folder", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 183, + line: 5, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 191, + line: 5, + col: 41, + }, + }, + Format: "", + Value: "static", + }, + }, + ], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 195, + line: 8, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 230, + line: 10, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 236, + line: 10, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 237, + line: 10, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 253, + line: 10, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 271, + line: 10, + col: 46, + }, + }, + Format: "", + Value: "admin/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 237, + line: 10, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 252, + line: 10, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 275, + line: 13, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index2", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 317, + line: 15, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 323, + line: 15, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 324, + line: 15, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 340, + line: 15, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 360, + line: 15, + col: 48, + }, + }, + Format: "", + Value: "./admin/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 324, + line: 15, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 339, + line: 15, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_29_dst.uast b/uast/diff/testdata/testcase_29_dst.uast new file mode 100644 index 00000000..13c01925 --- /dev/null +++ b/uast/diff/testdata/testcase_29_dst.uast @@ -0,0 +1,210 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 207, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 210, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n flask.__main__\n ~~~~~~~~~~~~~~\n\n Alias for flask.run for the command line.\n\n :copyright: (c) 2015 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 213, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 215, + line: 13, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 244, + line: 14, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 253, + line: 14, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "main", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../cli", + }, + Target: ~, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 270, + line: 15, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 270, + line: 15, + col: 5, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 270, + line: 15, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 274, + line: 15, + col: 9, + }, + }, + Name: "main", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "as_module", + }, + value: { '@type': "BoolLiteral", + '@token': "True", + '@role': [Argument, Boolean, Expression, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 285, + line: 15, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 289, + line: 15, + col: 24, + }, + }, + value: true, + }, + }, + ], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 216, + line: 13, + col: 4, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 228, + line: 13, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 238, + line: 13, + col: 26, + }, + }, + Format: "", + Value: "__main__", + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 216, + line: 13, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 224, + line: 13, + col: 12, + }, + }, + Name: "__name__", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_29_src.uast b/uast/diff/testdata/testcase_29_src.uast new file mode 100644 index 00000000..19d7aea6 --- /dev/null +++ b/uast/diff/testdata/testcase_29_src.uast @@ -0,0 +1,210 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 207, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 210, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n flask.__main__\n ~~~~~~~~~~~~~~\n\n Alias for flask.run for the command line.\n\n :copyright: (c) 2014 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 213, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 215, + line: 13, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 244, + line: 14, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 253, + line: 14, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "main", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../cli", + }, + Target: ~, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 270, + line: 15, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 270, + line: 15, + col: 5, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 270, + line: 15, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 274, + line: 15, + col: 9, + }, + }, + Name: "main", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "as_module", + }, + value: { '@type': "BoolLiteral", + '@token': "True", + '@role': [Argument, Boolean, Expression, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 285, + line: 15, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 289, + line: 15, + col: 24, + }, + }, + value: true, + }, + }, + ], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 216, + line: 13, + col: 4, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 228, + line: 13, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 238, + line: 13, + col: 26, + }, + }, + Format: "", + Value: "__main__", + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 216, + line: 13, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 224, + line: 13, + col: 12, + }, + }, + Name: "__name__", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_2_dst.uast b/uast/diff/testdata/testcase_2_dst.uast new file mode 100644 index 00000000..c64b255e --- /dev/null +++ b/uast/diff/testdata/testcase_2_dst.uast @@ -0,0 +1,155 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 10, + line: 1, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 27, + line: 2, + col: 4, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 30, + line: 2, + col: 7, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 36, + line: 2, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 53, + line: 2, + col: 30, + }, + }, + Format: "", + Value: "yourapplication", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 30, + line: 2, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 35, + line: 2, + col: 12, + }, + }, + Name: "Flask", + }, + keywords: [], + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 56, + line: 4, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "yourapplication.views", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 55, + line: 3, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 55, + line: 3, + col: 1, + }, + }, + lines: [], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_2_src.uast b/uast/diff/testdata/testcase_2_src.uast new file mode 100644 index 00000000..a62a1070 --- /dev/null +++ b/uast/diff/testdata/testcase_2_src.uast @@ -0,0 +1,154 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 10, + line: 1, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 27, + line: 2, + col: 4, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 30, + line: 2, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 36, + line: 2, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 44, + line: 2, + col: 21, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 30, + line: 2, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 35, + line: 2, + col: 12, + }, + }, + Name: "Flask", + }, + keywords: [], + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 47, + line: 4, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "yourapplication.views", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 46, + line: 3, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 46, + line: 3, + col: 1, + }, + }, + lines: [], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_30_dst.uast b/uast/diff/testdata/testcase_30_dst.uast new file mode 100644 index 00000000..91041ad0 --- /dev/null +++ b/uast/diff/testdata/testcase_30_dst.uast @@ -0,0 +1,757 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 15, + line: 1, + col: 16, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "absolute_import", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "print_function", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "__future__", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 56, + line: 3, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 66, + line: 3, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 86, + line: 6, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 96, + line: 6, + col: 15, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "create_app", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 104, + line: 7, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 110, + line: 7, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 111, + line: 7, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 117, + line: 7, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 122, + line: 7, + col: 23, + }, + }, + Format: "", + Value: "app", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 111, + line: 7, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 116, + line: 7, + col: 17, + }, + }, + Name: "Flask", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 130, + line: 10, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 141, + line: 10, + col: 16, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "create_app2", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 157, + line: 11, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 163, + line: 11, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 164, + line: 11, + col: 12, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 170, + line: 11, + col: 18, + }, + }, + args: [ + { '@type': "List", + '@role': [Argument, Call, Expression, Function, List, Literal, Name, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 179, + line: 11, + col: 27, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 180, + line: 11, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 186, + line: 11, + col: 34, + }, + }, + Format: "", + Value: "app2", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 188, + line: 11, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 191, + line: 11, + col: 39, + }, + }, + Name: "foo", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 193, + line: 11, + col: 41, + }, + end: { '@type': "uast:Position", + offset: 196, + line: 11, + col: 44, + }, + }, + Name: "bar", + }, + ], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 171, + line: 11, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 174, + line: 11, + col: 22, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 170, + line: 11, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 173, + line: 11, + col: 21, + }, + }, + Format: "", + Value: "_", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 170, + line: 11, + col: 18, + }, + }, + Name: "join", + }, + ], + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 164, + line: 11, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 169, + line: 11, + col: 17, + }, + }, + Name: "Flask", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 142, + line: 10, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 145, + line: 10, + col: 20, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 142, + line: 10, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 145, + line: 10, + col: 20, + }, + }, + Name: "foo", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 147, + line: 10, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 150, + line: 10, + col: 25, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 147, + line: 10, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 150, + line: 10, + col: 25, + }, + }, + Name: "bar", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 206, + line: 14, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 217, + line: 14, + col: 16, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "create_app3", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 241, + line: 15, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 247, + line: 15, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 248, + line: 15, + col: 12, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 254, + line: 15, + col: 18, + }, + }, + args: [ + { '@type': "List", + '@role': [Argument, Call, Expression, Function, List, Literal, Name, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 263, + line: 15, + col: 27, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 264, + line: 15, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 270, + line: 15, + col: 34, + }, + }, + Format: "", + Value: "app3", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 272, + line: 15, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 275, + line: 15, + col: 39, + }, + }, + Name: "foo", + }, + { '@type': "Subscript", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 277, + line: 15, + col: 41, + }, + }, + ctx: "Load", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 294, + line: 15, + col: 58, + }, + end: { '@type': "uast:Position", + offset: 300, + line: 15, + col: 64, + }, + }, + Format: "", + Value: "test", + }, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 278, + line: 15, + col: 42, + }, + end: { '@type': "uast:Position", + offset: 289, + line: 15, + col: 53, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 277, + line: 15, + col: 41, + }, + end: { '@type': "uast:Position", + offset: 288, + line: 15, + col: 52, + }, + }, + Name: "script_info", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 277, + line: 15, + col: 41, + }, + }, + Name: "data", + }, + ], + }, + }, + ], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 255, + line: 15, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 258, + line: 15, + col: 22, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 254, + line: 15, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 257, + line: 15, + col: 21, + }, + }, + Format: "", + Value: "_", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 254, + line: 15, + col: 18, + }, + }, + Name: "join", + }, + ], + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 248, + line: 15, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 253, + line: 15, + col: 17, + }, + }, + Name: "Flask", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 218, + line: 14, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 221, + line: 14, + col: 20, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 218, + line: 14, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 221, + line: 14, + col: 20, + }, + }, + Name: "foo", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 223, + line: 14, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 234, + line: 14, + col: 33, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 223, + line: 14, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 234, + line: 14, + col: 33, + }, + }, + Name: "script_info", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_30_src.uast b/uast/diff/testdata/testcase_30_src.uast new file mode 100644 index 00000000..8e1a0fff --- /dev/null +++ b/uast/diff/testdata/testcase_30_src.uast @@ -0,0 +1,731 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 15, + line: 1, + col: 16, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "absolute_import", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "print_function", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "__future__", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 56, + line: 3, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 66, + line: 3, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 86, + line: 6, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 96, + line: 6, + col: 15, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "create_app", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 104, + line: 7, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 110, + line: 7, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 111, + line: 7, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 117, + line: 7, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 129, + line: 7, + col: 30, + }, + }, + Format: "", + Value: "create_app", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 111, + line: 7, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 116, + line: 7, + col: 17, + }, + }, + Name: "Flask", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 137, + line: 10, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 148, + line: 10, + col: 16, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "create_app2", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 164, + line: 11, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 170, + line: 11, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 171, + line: 11, + col: 12, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 177, + line: 11, + col: 18, + }, + }, + args: [ + { '@type': "List", + '@role': [Argument, Call, Expression, Function, List, Literal, Name, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 186, + line: 11, + col: 27, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 187, + line: 11, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 200, + line: 11, + col: 41, + }, + }, + Format: "", + Value: "create_app2", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 202, + line: 11, + col: 43, + }, + end: { '@type': "uast:Position", + offset: 205, + line: 11, + col: 46, + }, + }, + Name: "foo", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 207, + line: 11, + col: 48, + }, + end: { '@type': "uast:Position", + offset: 210, + line: 11, + col: 51, + }, + }, + Name: "bar", + }, + ], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 178, + line: 11, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 181, + line: 11, + col: 22, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 177, + line: 11, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 180, + line: 11, + col: 21, + }, + }, + Format: "", + Value: "_", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 177, + line: 11, + col: 18, + }, + }, + Name: "join", + }, + ], + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 171, + line: 11, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 176, + line: 11, + col: 17, + }, + }, + Name: "Flask", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 149, + line: 10, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 152, + line: 10, + col: 20, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 149, + line: 10, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 152, + line: 10, + col: 20, + }, + }, + Name: "foo", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 154, + line: 10, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 157, + line: 10, + col: 25, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 154, + line: 10, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 157, + line: 10, + col: 25, + }, + }, + Name: "bar", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 220, + line: 14, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 231, + line: 14, + col: 16, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "create_app3", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 260, + line: 15, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 266, + line: 15, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 267, + line: 15, + col: 12, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 273, + line: 15, + col: 18, + }, + }, + args: [ + { '@type': "List", + '@role': [Argument, Call, Expression, Function, List, Literal, Name, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 282, + line: 15, + col: 27, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 283, + line: 15, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 296, + line: 15, + col: 41, + }, + }, + Format: "", + Value: "create_app3", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 298, + line: 15, + col: 43, + }, + end: { '@type': "uast:Position", + offset: 301, + line: 15, + col: 46, + }, + }, + Name: "foo", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 303, + line: 15, + col: 48, + }, + end: { '@type': "uast:Position", + offset: 306, + line: 15, + col: 51, + }, + }, + Name: "bar", + }, + ], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 274, + line: 15, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 277, + line: 15, + col: 22, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 273, + line: 15, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 276, + line: 15, + col: 21, + }, + }, + Format: "", + Value: "_", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 273, + line: 15, + col: 18, + }, + }, + Name: "join", + }, + ], + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 267, + line: 15, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 272, + line: 15, + col: 17, + }, + }, + Name: "Flask", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 232, + line: 14, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 235, + line: 14, + col: 20, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 232, + line: 14, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 235, + line: 14, + col: 20, + }, + }, + Name: "foo", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 237, + line: 14, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 240, + line: 14, + col: 25, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 237, + line: 14, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 240, + line: 14, + col: 25, + }, + }, + Name: "bar", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 242, + line: 14, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 253, + line: 14, + col: 38, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 242, + line: 14, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 253, + line: 14, + col: 38, + }, + }, + Name: "script_info", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_31_dst.uast b/uast/diff/testdata/testcase_31_dst.uast new file mode 100644 index 00000000..9949914d --- /dev/null +++ b/uast/diff/testdata/testcase_31_dst.uast @@ -0,0 +1,392 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 10, + line: 1, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 46, + line: 3, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 46, + line: 3, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 51, + line: 3, + col: 6, + }, + }, + Name: "admin", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 54, + line: 3, + col: 9, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 64, + line: 3, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 71, + line: 3, + col: 26, + }, + }, + Format: "", + Value: "admin", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 73, + line: 3, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 81, + line: 3, + col: 36, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 54, + line: 3, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 63, + line: 3, + col: 18, + }, + }, + Name: "Blueprint", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "url_prefix", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 94, + line: 3, + col: 49, + }, + end: { '@type': "uast:Position", + offset: 102, + line: 3, + col: 57, + }, + }, + Format: "", + Value: "/admin", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "template_folder", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 138, + line: 4, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 149, + line: 4, + col: 46, + }, + }, + Format: "", + Value: "templates", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "static_folder", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 183, + line: 5, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 191, + line: 5, + col: 41, + }, + }, + Format: "", + Value: "static", + }, + }, + ], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 195, + line: 8, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 230, + line: 10, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 236, + line: 10, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 237, + line: 10, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 253, + line: 10, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 271, + line: 10, + col: 46, + }, + }, + Format: "", + Value: "admin/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 237, + line: 10, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 252, + line: 10, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 275, + line: 13, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index2", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 317, + line: 15, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 323, + line: 15, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 324, + line: 15, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 340, + line: 15, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 360, + line: 15, + col: 48, + }, + }, + Format: "", + Value: "./admin/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 324, + line: 15, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 339, + line: 15, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_31_src.uast b/uast/diff/testdata/testcase_31_src.uast new file mode 100644 index 00000000..a9d72176 --- /dev/null +++ b/uast/diff/testdata/testcase_31_src.uast @@ -0,0 +1,325 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 10, + line: 1, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 46, + line: 3, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 46, + line: 3, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 51, + line: 3, + col: 6, + }, + }, + Name: "admin", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 54, + line: 3, + col: 9, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 64, + line: 3, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 72, + line: 3, + col: 27, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 54, + line: 3, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 63, + line: 3, + col: 18, + }, + }, + Name: "Blueprint", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "url_prefix", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 85, + line: 3, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 93, + line: 3, + col: 48, + }, + }, + Format: "", + Value: "/admin", + }, + }, + ], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 97, + line: 6, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 132, + line: 8, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 138, + line: 8, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 139, + line: 8, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 155, + line: 8, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 173, + line: 8, + col: 46, + }, + }, + Format: "", + Value: "admin/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 139, + line: 8, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 154, + line: 8, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 177, + line: 11, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index2", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 219, + line: 13, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 225, + line: 13, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 226, + line: 13, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 242, + line: 13, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 262, + line: 13, + col: 48, + }, + }, + Format: "", + Value: "./admin/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 226, + line: 13, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 241, + line: 13, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_32_dst.uast b/uast/diff/testdata/testcase_32_dst.uast new file mode 100644 index 00000000..9949914d --- /dev/null +++ b/uast/diff/testdata/testcase_32_dst.uast @@ -0,0 +1,392 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 10, + line: 1, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 46, + line: 3, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 46, + line: 3, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 51, + line: 3, + col: 6, + }, + }, + Name: "admin", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 54, + line: 3, + col: 9, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 64, + line: 3, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 71, + line: 3, + col: 26, + }, + }, + Format: "", + Value: "admin", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 73, + line: 3, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 81, + line: 3, + col: 36, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 54, + line: 3, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 63, + line: 3, + col: 18, + }, + }, + Name: "Blueprint", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "url_prefix", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 94, + line: 3, + col: 49, + }, + end: { '@type': "uast:Position", + offset: 102, + line: 3, + col: 57, + }, + }, + Format: "", + Value: "/admin", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "template_folder", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 138, + line: 4, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 149, + line: 4, + col: 46, + }, + }, + Format: "", + Value: "templates", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "static_folder", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 183, + line: 5, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 191, + line: 5, + col: 41, + }, + }, + Format: "", + Value: "static", + }, + }, + ], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 195, + line: 8, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 230, + line: 10, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 236, + line: 10, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 237, + line: 10, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 253, + line: 10, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 271, + line: 10, + col: 46, + }, + }, + Format: "", + Value: "admin/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 237, + line: 10, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 252, + line: 10, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 275, + line: 13, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index2", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 317, + line: 15, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 323, + line: 15, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 324, + line: 15, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 340, + line: 15, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 360, + line: 15, + col: 48, + }, + }, + Format: "", + Value: "./admin/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 324, + line: 15, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 339, + line: 15, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_32_src.uast b/uast/diff/testdata/testcase_32_src.uast new file mode 100644 index 00000000..9949914d --- /dev/null +++ b/uast/diff/testdata/testcase_32_src.uast @@ -0,0 +1,392 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 10, + line: 1, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 46, + line: 3, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 46, + line: 3, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 51, + line: 3, + col: 6, + }, + }, + Name: "admin", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 54, + line: 3, + col: 9, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 64, + line: 3, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 71, + line: 3, + col: 26, + }, + }, + Format: "", + Value: "admin", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 73, + line: 3, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 81, + line: 3, + col: 36, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 54, + line: 3, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 63, + line: 3, + col: 18, + }, + }, + Name: "Blueprint", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "url_prefix", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 94, + line: 3, + col: 49, + }, + end: { '@type': "uast:Position", + offset: 102, + line: 3, + col: 57, + }, + }, + Format: "", + Value: "/admin", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "template_folder", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 138, + line: 4, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 149, + line: 4, + col: 46, + }, + }, + Format: "", + Value: "templates", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "static_folder", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 183, + line: 5, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 191, + line: 5, + col: 41, + }, + }, + Format: "", + Value: "static", + }, + }, + ], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 195, + line: 8, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 230, + line: 10, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 236, + line: 10, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 237, + line: 10, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 253, + line: 10, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 271, + line: 10, + col: 46, + }, + }, + Format: "", + Value: "admin/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 237, + line: 10, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 252, + line: 10, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 275, + line: 13, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index2", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 317, + line: 15, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 323, + line: 15, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 324, + line: 15, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 340, + line: 15, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 360, + line: 15, + col: 48, + }, + }, + Format: "", + Value: "./admin/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 324, + line: 15, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 339, + line: 15, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_33_dst.uast b/uast/diff/testdata/testcase_33_dst.uast new file mode 100644 index 00000000..22c066a0 --- /dev/null +++ b/uast/diff/testdata/testcase_33_dst.uast @@ -0,0 +1,306 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 191, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 194, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n Flaskr Tests\n ~~~~~~~~~~~~\n\n Tests the Flaskr application.\n\n :copyright: (c) 2015 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 196, + line: 12, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 211, + line: 12, + col: 16, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "setup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "find_packages", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "setuptools", + }, + Target: ~, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 241, + line: 14, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 241, + line: 14, + col: 1, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 241, + line: 14, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 246, + line: 14, + col: 6, + }, + }, + Name: "setup", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "name", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 15, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 265, + line: 15, + col: 18, + }, + }, + Format: "", + Value: "flaskr", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "packages", + }, + value: { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 280, + line: 16, + col: 14, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 280, + line: 16, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 293, + line: 16, + col: 27, + }, + }, + Name: "find_packages", + }, + keywords: [], + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "include_package_data", + }, + value: { '@type': "BoolLiteral", + '@token': "True", + '@role': [Argument, Boolean, Expression, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 322, + line: 17, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 326, + line: 17, + col: 30, + }, + }, + value: true, + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "install_requires", + }, + value: { '@type': "List", + '@role': [Argument, Expression, List, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 349, + line: 18, + col: 22, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 359, + line: 19, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 366, + line: 19, + col: 16, + }, + }, + Format: "", + Value: "flask", + }, + ], + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "setup_requires", + }, + value: { '@type': "List", + '@role': [Argument, Expression, List, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 394, + line: 21, + col: 20, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 404, + line: 22, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 419, + line: 22, + col: 24, + }, + }, + Format: "", + Value: "pytest-runner", + }, + ], + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "tests_require", + }, + value: { '@type': "List", + '@role': [Argument, Expression, List, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 24, + col: 19, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 456, + line: 25, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 464, + line: 25, + col: 17, + }, + }, + Format: "", + Value: "pytest", + }, + ], + }, + }, + ], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_33_src.uast b/uast/diff/testdata/testcase_33_src.uast new file mode 100644 index 00000000..2de71353 --- /dev/null +++ b/uast/diff/testdata/testcase_33_src.uast @@ -0,0 +1,273 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 15, + line: 1, + col: 16, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "setup", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "setuptools", + }, + Target: ~, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 30, + line: 3, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 30, + line: 3, + col: 1, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 30, + line: 3, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 35, + line: 3, + col: 6, + }, + }, + Name: "setup", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "name", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 46, + line: 4, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 54, + line: 4, + col: 18, + }, + }, + Format: "", + Value: "flaskr", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "packages", + }, + value: { '@type': "List", + '@role': [Argument, Expression, List, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 69, + line: 5, + col: 14, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 70, + line: 5, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 78, + line: 5, + col: 23, + }, + }, + Format: "", + Value: "flaskr", + }, + ], + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "include_package_data", + }, + value: { '@type': "BoolLiteral", + '@token': "True", + '@role': [Argument, Boolean, Expression, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 106, + line: 6, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 110, + line: 6, + col: 30, + }, + }, + value: true, + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "install_requires", + }, + value: { '@type': "List", + '@role': [Argument, Expression, List, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 133, + line: 7, + col: 22, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 143, + line: 8, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 150, + line: 8, + col: 16, + }, + }, + Format: "", + Value: "flask", + }, + ], + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "setup_requires", + }, + value: { '@type': "List", + '@role': [Argument, Expression, List, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 178, + line: 10, + col: 20, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 188, + line: 11, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 203, + line: 11, + col: 24, + }, + }, + Format: "", + Value: "pytest-runner", + }, + ], + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "tests_require", + }, + value: { '@type': "List", + '@role': [Argument, Expression, List, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 230, + line: 13, + col: 19, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 240, + line: 14, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 248, + line: 14, + col: 17, + }, + }, + Format: "", + Value: "pytest", + }, + ], + }, + }, + ], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_34_dst.uast b/uast/diff/testdata/testcase_34_dst.uast new file mode 100644 index 00000000..ab914d3a --- /dev/null +++ b/uast/diff/testdata/testcase_34_dst.uast @@ -0,0 +1,419 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 15, + line: 1, + col: 16, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "setup", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "setuptools", + }, + Target: ~, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 31, + line: 4, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 31, + line: 4, + col: 1, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 31, + line: 4, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 36, + line: 4, + col: 6, + }, + }, + Name: "setup", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "name", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 47, + line: 5, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 54, + line: 5, + col: 17, + }, + }, + Format: "", + Value: "Flask", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "version", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 68, + line: 6, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 73, + line: 6, + col: 18, + }, + }, + Format: "", + Value: "0.1", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "url", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 83, + line: 7, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 119, + line: 7, + col: 45, + }, + }, + Format: "", + Value: "http://github.com/mitsuhiko/flask/", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "license", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 133, + line: 8, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 138, + line: 8, + col: 18, + }, + }, + Format: "", + Value: "BSD", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "author", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 151, + line: 9, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 167, + line: 9, + col: 28, + }, + }, + Format: "", + Value: "Armin Ronacher", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "author_email", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 186, + line: 10, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 215, + line: 10, + col: 47, + }, + }, + Format: "", + Value: "armin.ronacher@active-4.com", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "description", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 233, + line: 11, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 297, + line: 11, + col: 81, + }, + }, + Format: "", + Value: "A microframework based on Werkzeug, Jinja2 and good intentions", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "modules", + }, + value: { '@type': "List", + '@role': [Argument, Expression, List, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 311, + line: 12, + col: 13, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 312, + line: 12, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 319, + line: 12, + col: 21, + }, + }, + Format: "", + Value: "flask", + }, + ], + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "zip_safe", + }, + value: { '@type': "BoolLiteral", + '@token': "False", + '@role': [Argument, Boolean, Expression, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 335, + line: 13, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 340, + line: 13, + col: 19, + }, + }, + value: false, + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "platforms", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 356, + line: 14, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 361, + line: 14, + col: 20, + }, + }, + Format: "", + Value: "any", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "install_requires", + }, + value: { '@type': "List", + '@role': [Argument, Expression, List, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 384, + line: 15, + col: 22, + }, + }, + ctx: "Load", + elts: [], + }, + }, + ], + }, + }, + ], + 'noops_remainder': { '@type': "RemainderNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 386, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 460, + line: 18, + col: 1, + }, + }, + lines: [ + { '@type': "uast:Comment", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 386, + line: 16, + col: 1, + }, + }, + Block: false, + Prefix: "# ", + Suffix: "\n", + Tab: "", + Text: "disabled until release, install yourself", + }, + { '@type': "uast:Comment", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 438, + line: 17, + col: 1, + }, + }, + Block: false, + Prefix: " '", + Suffix: "\n", + Tab: "", + Text: "Werkzeug',", + }, + { '@type': "uast:Comment", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 460, + line: 18, + col: 1, + }, + }, + Block: false, + Prefix: " '", + Suffix: "\n", + Tab: "", + Text: "Jinja2'", + }, + ], + }, +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_34_src.uast b/uast/diff/testdata/testcase_34_src.uast new file mode 100644 index 00000000..5b66c62b --- /dev/null +++ b/uast/diff/testdata/testcase_34_src.uast @@ -0,0 +1,416 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 15, + line: 1, + col: 16, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "setup", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "setuptools", + }, + Target: ~, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 31, + line: 4, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 31, + line: 4, + col: 1, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 31, + line: 4, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 36, + line: 4, + col: 6, + }, + }, + Name: "setup", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "name", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 47, + line: 5, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 54, + line: 5, + col: 17, + }, + }, + Format: "", + Value: "Flask", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "version", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 68, + line: 6, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 73, + line: 6, + col: 18, + }, + }, + Format: "", + Value: "0.1", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "url", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 83, + line: 7, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 119, + line: 7, + col: 45, + }, + }, + Format: "", + Value: "http://github.com/mitsuhiko/flask/", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "license", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 133, + line: 8, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 138, + line: 8, + col: 18, + }, + }, + Format: "", + Value: "BSD", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "author", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 151, + line: 9, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 167, + line: 9, + col: 28, + }, + }, + Format: "", + Value: "Armin Ronacher", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "author_email", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 186, + line: 10, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 215, + line: 10, + col: 47, + }, + }, + Format: "", + Value: "armin.ronacher@active-4.com", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "description", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 233, + line: 11, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 297, + line: 11, + col: 81, + }, + }, + Format: "", + Value: "A microframework based on Werkzeug, Jinja2 and good intentions", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "modules", + }, + value: { '@type': "List", + '@role': [Argument, Expression, List, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 311, + line: 12, + col: 13, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 312, + line: 12, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 319, + line: 12, + col: 21, + }, + }, + Format: "", + Value: "flask", + }, + ], + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "zip_safe", + }, + value: { '@type': "BoolLiteral", + '@token': "False", + '@role': [Argument, Boolean, Expression, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 335, + line: 13, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 340, + line: 13, + col: 19, + }, + }, + value: false, + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "platforms", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 356, + line: 14, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 361, + line: 14, + col: 20, + }, + }, + Format: "", + Value: "any", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "install_requires", + }, + value: { '@type': "List", + '@role': [Argument, Expression, List, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 384, + line: 15, + col: 22, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 444, + line: 16, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 459, + line: 16, + col: 24, + }, + }, + Format: "", + Value: "Werkzeug==dev", + }, + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 469, + line: 17, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 482, + line: 17, + col: 22, + }, + }, + Format: "", + Value: "Jinja2==dev", + }, + ], + 'noops_sameline': { '@type': "SameLineNoops", + '@role': [Comment], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 385, + line: 15, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 434, + line: 15, + col: 72, + }, + }, + 'noop_lines': [ + { '@type': "uast:Comment", + '@pos': { '@type': "uast:Positions", + }, + Block: false, + Prefix: "# ", + Suffix: "", + Tab: "", + Text: "yes, as of now we need the development versions", + }, + ], + }, + }, + }, + ], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_35_dst.uast b/uast/diff/testdata/testcase_35_dst.uast new file mode 100644 index 00000000..bba29577 --- /dev/null +++ b/uast/diff/testdata/testcase_35_dst.uast @@ -0,0 +1,390 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 15, + line: 1, + col: 16, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "setup", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "setuptools", + }, + Target: ~, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 31, + line: 4, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 31, + line: 4, + col: 1, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 31, + line: 4, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 36, + line: 4, + col: 6, + }, + }, + Name: "setup", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "name", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 47, + line: 5, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 54, + line: 5, + col: 17, + }, + }, + Format: "", + Value: "Flask", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "version", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 68, + line: 6, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 73, + line: 6, + col: 18, + }, + }, + Format: "", + Value: "0.1", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "url", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 83, + line: 7, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 119, + line: 7, + col: 45, + }, + }, + Format: "", + Value: "http://github.com/mitsuhiko/flask/", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "license", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 133, + line: 8, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 138, + line: 8, + col: 18, + }, + }, + Format: "", + Value: "BSD", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "author", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 151, + line: 9, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 167, + line: 9, + col: 28, + }, + }, + Format: "", + Value: "Armin Ronacher", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "author_email", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 186, + line: 10, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 215, + line: 10, + col: 47, + }, + }, + Format: "", + Value: "armin.ronacher@active-4.com", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "description", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 233, + line: 11, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 297, + line: 11, + col: 81, + }, + }, + Format: "", + Value: "A microframework based on Werkzeug, Jinja2 and good intentions", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "py_modules", + }, + value: { '@type': "List", + '@role': [Argument, Expression, List, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 314, + line: 12, + col: 16, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 315, + line: 12, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 322, + line: 12, + col: 24, + }, + }, + Format: "", + Value: "flask", + }, + ], + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "zip_safe", + }, + value: { '@type': "BoolLiteral", + '@token': "False", + '@role': [Argument, Boolean, Expression, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 338, + line: 13, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 343, + line: 13, + col: 19, + }, + }, + value: false, + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "platforms", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 359, + line: 14, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 364, + line: 14, + col: 20, + }, + }, + Format: "", + Value: "any", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "install_requires", + }, + value: { '@type': "List", + '@role': [Argument, Expression, List, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 387, + line: 15, + col: 22, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 397, + line: 16, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 414, + line: 16, + col: 26, + }, + }, + Format: "", + Value: "Werkzeug>=0.6.1", + }, + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 424, + line: 17, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 437, + line: 17, + col: 22, + }, + }, + Format: "", + Value: "Jinja2>=2.4", + }, + ], + }, + }, + ], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_35_src.uast b/uast/diff/testdata/testcase_35_src.uast new file mode 100644 index 00000000..84b34cd6 --- /dev/null +++ b/uast/diff/testdata/testcase_35_src.uast @@ -0,0 +1,419 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 15, + line: 1, + col: 16, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "setup", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "setuptools", + }, + Target: ~, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 31, + line: 4, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 31, + line: 4, + col: 1, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 31, + line: 4, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 36, + line: 4, + col: 6, + }, + }, + Name: "setup", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "name", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 47, + line: 5, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 54, + line: 5, + col: 17, + }, + }, + Format: "", + Value: "Flask", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "version", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 68, + line: 6, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 73, + line: 6, + col: 18, + }, + }, + Format: "", + Value: "0.1", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "url", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 83, + line: 7, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 119, + line: 7, + col: 45, + }, + }, + Format: "", + Value: "http://github.com/mitsuhiko/flask/", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "license", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 133, + line: 8, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 138, + line: 8, + col: 18, + }, + }, + Format: "", + Value: "BSD", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "author", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 151, + line: 9, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 167, + line: 9, + col: 28, + }, + }, + Format: "", + Value: "Armin Ronacher", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "author_email", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 186, + line: 10, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 215, + line: 10, + col: 47, + }, + }, + Format: "", + Value: "armin.ronacher@active-4.com", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "description", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 233, + line: 11, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 297, + line: 11, + col: 81, + }, + }, + Format: "", + Value: "A microframework based on Werkzeug, Jinja2 and good intentions", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "py_modules", + }, + value: { '@type': "List", + '@role': [Argument, Expression, List, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 314, + line: 12, + col: 16, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 315, + line: 12, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 322, + line: 12, + col: 24, + }, + }, + Format: "", + Value: "flask", + }, + ], + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "zip_safe", + }, + value: { '@type': "BoolLiteral", + '@token': "False", + '@role': [Argument, Boolean, Expression, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 338, + line: 13, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 343, + line: 13, + col: 19, + }, + }, + value: false, + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "platforms", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 359, + line: 14, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 364, + line: 14, + col: 20, + }, + }, + Format: "", + Value: "any", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "install_requires", + }, + value: { '@type': "List", + '@role': [Argument, Expression, List, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 387, + line: 15, + col: 22, + }, + }, + ctx: "Load", + elts: [], + }, + }, + ], + }, + }, + ], + 'noops_remainder': { '@type': "RemainderNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 389, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 463, + line: 18, + col: 1, + }, + }, + lines: [ + { '@type': "uast:Comment", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 389, + line: 16, + col: 1, + }, + }, + Block: false, + Prefix: "# ", + Suffix: "\n", + Tab: "", + Text: "disabled until release, install yourself", + }, + { '@type': "uast:Comment", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 441, + line: 17, + col: 1, + }, + }, + Block: false, + Prefix: " '", + Suffix: "\n", + Tab: "", + Text: "Werkzeug',", + }, + { '@type': "uast:Comment", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 463, + line: 18, + col: 1, + }, + }, + Block: false, + Prefix: " '", + Suffix: "\n", + Tab: "", + Text: "Jinja2'", + }, + ], + }, +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_36_dst.uast b/uast/diff/testdata/testcase_36_dst.uast new file mode 100644 index 00000000..cee2fe48 --- /dev/null +++ b/uast/diff/testdata/testcase_36_dst.uast @@ -0,0 +1,255 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 258, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask.session\n ~~~~~~~~~~~~~\n\n This module used to flask with the session global so we moved it\n over to flask.sessions\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 260, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 273, + line: 13, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "warn", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "warnings", + }, + Target: ~, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 286, + line: 14, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 286, + line: 14, + col: 1, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 291, + line: 14, + col: 6, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 310, + line: 14, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 345, + line: 14, + col: 60, + }, + }, + Format: "", + Value: "please use flask.sessions instead", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 291, + line: 14, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 309, + line: 14, + col: 24, + }, + }, + Name: "DeprecationWarning", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 286, + line: 14, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 290, + line: 14, + col: 5, + }, + }, + Name: "warn", + }, + keywords: [], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 349, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 363, + line: 16, + col: 15, + }, + }, + All: true, + Names: ~, + Path: { '@type': "uast:Identifier", + Name: "../sessions", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 18, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 381, + line: 18, + col: 8, + }, + }, + Name: "Session", + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 384, + line: 18, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 403, + line: 18, + col: 30, + }, + }, + Name: "SecureCookieSession", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 404, + line: 19, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 404, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 416, + line: 19, + col: 13, + }, + }, + Name: "_NullSession", + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 419, + line: 19, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 430, + line: 19, + col: 27, + }, + }, + Name: "NullSession", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_36_src.uast b/uast/diff/testdata/testcase_36_src.uast new file mode 100644 index 00000000..7775525f --- /dev/null +++ b/uast/diff/testdata/testcase_36_src.uast @@ -0,0 +1,1088 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 242, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 245, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask.session\n ~~~~~~~~~~~~~\n\n Implements cookie based sessions based on Werkzeug's secure cookie\n system.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 247, + line: 13, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "SecureCookie", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.contrib.securecookie", + }, + Target: ~, + }, + { '@type': "ClassDef", + '@token': "Session", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 310, + line: 16, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 317, + line: 16, + col: 14, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 318, + line: 16, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 330, + line: 16, + col: 27, + }, + }, + Name: "SecureCookie", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 437, + line: 19, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 337, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 444, + line: 19, + col: 8, + }, + }, + Format: "", + Value: "Expands the session with support for switching between permanent\n and non-permanent sessions.\n ", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 454, + line: 21, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 468, + line: 21, + col: 23, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_get_permanent", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 484, + line: 22, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 490, + line: 22, + col: 15, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 491, + line: 22, + col: 16, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 500, + line: 22, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 512, + line: 22, + col: 37, + }, + }, + Format: "", + Value: "_permanent", + }, + { '@type': "BoolLiteral", + '@token': "False", + '@role': [Argument, Boolean, Call, Expression, Function, Literal, Name, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 514, + line: 22, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 519, + line: 22, + col: 44, + }, + }, + value: false, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 492, + line: 22, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 496, + line: 22, + col: 21, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 491, + line: 22, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 495, + line: 22, + col: 20, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 491, + line: 22, + col: 16, + }, + }, + Name: "get", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 469, + line: 21, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 473, + line: 21, + col: 28, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 469, + line: 21, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 473, + line: 21, + col: 28, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 530, + line: 24, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 544, + line: 24, + col: 23, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_set_permanent", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 567, + line: 25, + col: 9, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 567, + line: 25, + col: 9, + }, + }, + ctx: "Store", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 572, + line: 25, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 584, + line: 25, + col: 26, + }, + }, + Format: "", + Value: "_permanent", + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 567, + line: 25, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 571, + line: 25, + col: 13, + }, + }, + Name: "self", + }, + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 588, + line: 25, + col: 30, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 593, + line: 25, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 598, + line: 25, + col: 40, + }, + }, + Name: "value", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 588, + line: 25, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 592, + line: 25, + col: 34, + }, + }, + Name: "bool", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 545, + line: 24, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 549, + line: 24, + col: 28, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 545, + line: 24, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 549, + line: 24, + col: 28, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 551, + line: 24, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 556, + line: 24, + col: 35, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 551, + line: 24, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 556, + line: 24, + col: 35, + }, + }, + Name: "value", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 605, + line: 27, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 605, + line: 27, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 614, + line: 27, + col: 14, + }, + }, + Name: "permanent", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 617, + line: 27, + col: 17, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 626, + line: 27, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 640, + line: 27, + col: 40, + }, + }, + Name: "_get_permanent", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 642, + line: 27, + col: 42, + }, + end: { '@type': "uast:Position", + offset: 656, + line: 27, + col: 56, + }, + }, + Name: "_set_permanent", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 617, + line: 27, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 625, + line: 27, + col: 25, + }, + }, + Name: "property", + }, + keywords: [], + }, + }, + { '@type': "Delete", + '@token': "del", + '@role': [Incomplete, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 662, + line: 28, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 665, + line: 28, + col: 8, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 666, + line: 28, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 680, + line: 28, + col: 23, + }, + }, + Name: "_get_permanent", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 682, + line: 28, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 696, + line: 28, + col: 39, + }, + }, + Name: "_set_permanent", + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "ClassDef", + '@token': "_NullSession", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 705, + line: 31, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 717, + line: 31, + col: 19, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 718, + line: 31, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 725, + line: 31, + col: 27, + }, + }, + Name: "Session", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 895, + line: 35, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 732, + line: 32, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 902, + line: 35, + col: 8, + }, + }, + Format: "", + Value: "Class used to generate nicer error messages if sessions are not\n available. Will still allow read-only access to the empty session\n but fail on setting.\n ", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 912, + line: 37, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 917, + line: 37, + col: 14, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_fail", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Raise", + '@token': "raise", + '@role': [Statement, Throw], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 950, + line: 38, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 955, + line: 38, + col: 14, + }, + }, + cause: ~, + exc: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 956, + line: 38, + col: 15, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 969, + line: 38, + col: 28, + }, + }, + Format: "", + Value: "the session is unavailable because no secret key was set. Set the secret_key on the application to something unique and secret.", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 956, + line: 38, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 968, + line: 38, + col: 27, + }, + }, + Name: "RuntimeError", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 918, + line: 37, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 922, + line: 37, + col: 19, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 918, + line: 37, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 922, + line: 37, + col: 19, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 933, + line: 37, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 939, + line: 37, + col: 36, + }, + }, + Init: ~, + MapVariadic: true, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 933, + line: 37, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 939, + line: 37, + col: 36, + }, + }, + Name: "kwargs", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 925, + line: 37, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 929, + line: 37, + col: 26, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 925, + line: 37, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 929, + line: 37, + col: 26, + }, + }, + Name: "args", + }, + Receiver: false, + Type: ~, + Variadic: true, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1165, + line: 41, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1165, + line: 41, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1176, + line: 41, + col: 16, + }, + }, + Name: "__setitem__", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1179, + line: 41, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 1190, + line: 41, + col: 30, + }, + }, + Name: "__delitem__", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1193, + line: 41, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 1198, + line: 41, + col: 38, + }, + }, + Name: "clear", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1201, + line: 41, + col: 41, + }, + end: { '@type': "uast:Position", + offset: 1204, + line: 41, + col: 44, + }, + }, + Name: "pop", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1207, + line: 41, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 1214, + line: 41, + col: 54, + }, + }, + Name: "popitem", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1227, + line: 42, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1233, + line: 42, + col: 15, + }, + }, + Name: "update", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1236, + line: 42, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 1246, + line: 42, + col: 28, + }, + }, + Name: "setdefault", + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1249, + line: 42, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 1254, + line: 42, + col: 36, + }, + }, + Name: "_fail", + }, + }, + { '@type': "Delete", + '@token': "del", + '@role': [Incomplete, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1259, + line: 43, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1262, + line: 43, + col: 8, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1263, + line: 43, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1268, + line: 43, + col: 14, + }, + }, + Name: "_fail", + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_37_dst.uast b/uast/diff/testdata/testcase_37_dst.uast new file mode 100644 index 00000000..7e9b1c8c --- /dev/null +++ b/uast/diff/testdata/testcase_37_dst.uast @@ -0,0 +1,589 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 669, + line: 39, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 672, + line: 39, + col: 4, + }, + }, + Format: "", + Value: "\nFlask\n-----\n\nFlask is a microframework for Python based on Werkzeug, Jinja 2 and good\nintentions. And before you ask: It's BSD licensed!\n\nFlask is Fun\n````````````\n\n::\n\n from flask import Flask\n app = Flask(__name__)\n\n @app.route(\"/\")\n def hello():\n return \"Hello World!\"\n\n if __name__ == \"__main__\":\n app.run()\n\nAnd Easy to Setup\n`````````````````\n\n::\n\n $ easy_install Flask\n $ python hello.py\n * Running on http://localhost:5000/\n\nLinks\n`````\n\n* `website `_\n* `documentation `_\n* `development version `_\n\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 673, + line: 40, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 688, + line: 40, + col: 16, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "setup", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "setuptools", + }, + Target: ~, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 704, + line: 43, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 704, + line: 43, + col: 1, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 704, + line: 43, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 709, + line: 43, + col: 6, + }, + }, + Name: "setup", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "name", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 720, + line: 44, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 727, + line: 44, + col: 17, + }, + }, + Format: "", + Value: "Flask", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "version", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 741, + line: 45, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 746, + line: 45, + col: 18, + }, + }, + Format: "", + Value: "0.1", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "url", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 756, + line: 46, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 792, + line: 46, + col: 45, + }, + }, + Format: "", + Value: "http://github.com/mitsuhiko/flask/", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "license", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 806, + line: 47, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 811, + line: 47, + col: 18, + }, + }, + Format: "", + Value: "BSD", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "author", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 824, + line: 48, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 840, + line: 48, + col: 28, + }, + }, + Format: "", + Value: "Armin Ronacher", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "author_email", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 859, + line: 49, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 888, + line: 49, + col: 47, + }, + }, + Format: "", + Value: "armin.ronacher@active-4.com", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "description", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 906, + line: 50, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 970, + line: 50, + col: 81, + }, + }, + Format: "", + Value: "A microframework based on Werkzeug, Jinja2 and good intentions", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "long_description", + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 993, + line: 51, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 1000, + line: 51, + col: 29, + }, + }, + Name: "__doc__", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "py_modules", + }, + value: { '@type': "List", + '@role': [Argument, Expression, List, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1017, + line: 52, + col: 16, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1018, + line: 52, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 1025, + line: 52, + col: 24, + }, + }, + Format: "", + Value: "flask", + }, + ], + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "zip_safe", + }, + value: { '@type': "BoolLiteral", + '@token': "False", + '@role': [Argument, Boolean, Expression, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1041, + line: 53, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 1046, + line: 53, + col: 19, + }, + }, + value: false, + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "platforms", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1062, + line: 54, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 1067, + line: 54, + col: 20, + }, + }, + Format: "", + Value: "any", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "install_requires", + }, + value: { '@type': "List", + '@role': [Argument, Expression, List, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1090, + line: 55, + col: 22, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1100, + line: 56, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1117, + line: 56, + col: 26, + }, + }, + Format: "", + Value: "Werkzeug>=0.6.1", + }, + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1127, + line: 57, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1140, + line: 57, + col: 22, + }, + }, + Format: "", + Value: "Jinja2>=2.4", + }, + ], + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "classifiers", + }, + value: { '@type': "List", + '@role': [Argument, Expression, List, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1164, + line: 59, + col: 17, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1174, + line: 60, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1207, + line: 60, + col: 42, + }, + }, + Format: "", + Value: "Development Status :: 3 - Alpha", + }, + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1217, + line: 61, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1249, + line: 61, + col: 41, + }, + }, + Format: "", + Value: "Environment :: Web Environment", + }, + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1259, + line: 62, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1292, + line: 62, + col: 42, + }, + }, + Format: "", + Value: "Intended Audience :: Developers", + }, + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1302, + line: 63, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1342, + line: 63, + col: 49, + }, + }, + Format: "", + Value: "License :: OSI Approved :: BSD License", + }, + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1352, + line: 64, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1388, + line: 64, + col: 45, + }, + }, + Format: "", + Value: "Operating System :: OS Independent", + }, + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1398, + line: 65, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1430, + line: 65, + col: 41, + }, + }, + Format: "", + Value: "Programming Language :: Python", + }, + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1440, + line: 66, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1490, + line: 66, + col: 59, + }, + }, + Format: "", + Value: "Topic :: Internet :: WWW/HTTP :: Dynamic Content", + }, + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1500, + line: 67, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1562, + line: 67, + col: 71, + }, + }, + Format: "", + Value: "Topic :: Software Development :: Libraries :: Python Modules", + }, + ], + }, + }, + ], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_37_src.uast b/uast/diff/testdata/testcase_37_src.uast new file mode 100644 index 00000000..bba29577 --- /dev/null +++ b/uast/diff/testdata/testcase_37_src.uast @@ -0,0 +1,390 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 15, + line: 1, + col: 16, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "setup", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "setuptools", + }, + Target: ~, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 31, + line: 4, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 31, + line: 4, + col: 1, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 31, + line: 4, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 36, + line: 4, + col: 6, + }, + }, + Name: "setup", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "name", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 47, + line: 5, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 54, + line: 5, + col: 17, + }, + }, + Format: "", + Value: "Flask", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "version", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 68, + line: 6, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 73, + line: 6, + col: 18, + }, + }, + Format: "", + Value: "0.1", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "url", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 83, + line: 7, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 119, + line: 7, + col: 45, + }, + }, + Format: "", + Value: "http://github.com/mitsuhiko/flask/", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "license", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 133, + line: 8, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 138, + line: 8, + col: 18, + }, + }, + Format: "", + Value: "BSD", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "author", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 151, + line: 9, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 167, + line: 9, + col: 28, + }, + }, + Format: "", + Value: "Armin Ronacher", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "author_email", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 186, + line: 10, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 215, + line: 10, + col: 47, + }, + }, + Format: "", + Value: "armin.ronacher@active-4.com", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "description", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 233, + line: 11, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 297, + line: 11, + col: 81, + }, + }, + Format: "", + Value: "A microframework based on Werkzeug, Jinja2 and good intentions", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "py_modules", + }, + value: { '@type': "List", + '@role': [Argument, Expression, List, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 314, + line: 12, + col: 16, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 315, + line: 12, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 322, + line: 12, + col: 24, + }, + }, + Format: "", + Value: "flask", + }, + ], + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "zip_safe", + }, + value: { '@type': "BoolLiteral", + '@token': "False", + '@role': [Argument, Boolean, Expression, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 338, + line: 13, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 343, + line: 13, + col: 19, + }, + }, + value: false, + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "platforms", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 359, + line: 14, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 364, + line: 14, + col: 20, + }, + }, + Format: "", + Value: "any", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "install_requires", + }, + value: { '@type': "List", + '@role': [Argument, Expression, List, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 387, + line: 15, + col: 22, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 397, + line: 16, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 414, + line: 16, + col: 26, + }, + }, + Format: "", + Value: "Werkzeug>=0.6.1", + }, + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 424, + line: 17, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 437, + line: 17, + col: 22, + }, + }, + Format: "", + Value: "Jinja2>=2.4", + }, + ], + }, + }, + ], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_38_dst.uast b/uast/diff/testdata/testcase_38_dst.uast new file mode 100644 index 00000000..d92632c7 --- /dev/null +++ b/uast/diff/testdata/testcase_38_dst.uast @@ -0,0 +1,255 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 258, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask.session\n ~~~~~~~~~~~~~\n\n This module used to flask with the session global so we moved it\n over to flask.sessions\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 260, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 273, + line: 13, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "warn", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "warnings", + }, + Target: ~, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 286, + line: 14, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 286, + line: 14, + col: 1, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 291, + line: 14, + col: 6, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 310, + line: 14, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 345, + line: 14, + col: 60, + }, + }, + Format: "", + Value: "please use flask.sessions instead", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 291, + line: 14, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 309, + line: 14, + col: 24, + }, + }, + Name: "DeprecationWarning", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 286, + line: 14, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 290, + line: 14, + col: 5, + }, + }, + Name: "warn", + }, + keywords: [], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 349, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 363, + line: 16, + col: 15, + }, + }, + All: true, + Names: ~, + Path: { '@type': "uast:Identifier", + Name: "../sessions", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 18, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 381, + line: 18, + col: 8, + }, + }, + Name: "Session", + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 384, + line: 18, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 403, + line: 18, + col: 30, + }, + }, + Name: "SecureCookieSession", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 404, + line: 19, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 404, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 416, + line: 19, + col: 13, + }, + }, + Name: "_NullSession", + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 419, + line: 19, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 430, + line: 19, + col: 27, + }, + }, + Name: "NullSession", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_38_src.uast b/uast/diff/testdata/testcase_38_src.uast new file mode 100644 index 00000000..cee2fe48 --- /dev/null +++ b/uast/diff/testdata/testcase_38_src.uast @@ -0,0 +1,255 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 258, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask.session\n ~~~~~~~~~~~~~\n\n This module used to flask with the session global so we moved it\n over to flask.sessions\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 260, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 273, + line: 13, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "warn", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "warnings", + }, + Target: ~, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 286, + line: 14, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 286, + line: 14, + col: 1, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 291, + line: 14, + col: 6, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 310, + line: 14, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 345, + line: 14, + col: 60, + }, + }, + Format: "", + Value: "please use flask.sessions instead", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 291, + line: 14, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 309, + line: 14, + col: 24, + }, + }, + Name: "DeprecationWarning", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 286, + line: 14, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 290, + line: 14, + col: 5, + }, + }, + Name: "warn", + }, + keywords: [], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 349, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 363, + line: 16, + col: 15, + }, + }, + All: true, + Names: ~, + Path: { '@type': "uast:Identifier", + Name: "../sessions", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 18, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 381, + line: 18, + col: 8, + }, + }, + Name: "Session", + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 384, + line: 18, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 403, + line: 18, + col: 30, + }, + }, + Name: "SecureCookieSession", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 404, + line: 19, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 404, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 416, + line: 19, + col: 13, + }, + }, + Name: "_NullSession", + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 419, + line: 19, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 430, + line: 19, + col: 27, + }, + }, + Name: "NullSession", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_39_dst.uast b/uast/diff/testdata/testcase_39_dst.uast new file mode 100644 index 00000000..5f90c94a --- /dev/null +++ b/uast/diff/testdata/testcase_39_dst.uast @@ -0,0 +1,272 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 258, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask.session\n ~~~~~~~~~~~~~\n\n This module used to flask with the session global so we moved it\n over to flask.sessions\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 260, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 273, + line: 13, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "warn", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "warnings", + }, + Target: ~, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 286, + line: 14, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 286, + line: 14, + col: 1, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 291, + line: 14, + col: 6, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 310, + line: 14, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 345, + line: 14, + col: 60, + }, + }, + Format: "", + Value: "please use flask.sessions instead", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 291, + line: 14, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 309, + line: 14, + col: 24, + }, + }, + Name: "DeprecationWarning", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 286, + line: 14, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 290, + line: 14, + col: 5, + }, + }, + Name: "warn", + }, + keywords: [], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 349, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 363, + line: 16, + col: 15, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "SecureCookieSession", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "NullSession", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../sessions", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 405, + line: 18, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 405, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 412, + line: 18, + col: 8, + }, + }, + Name: "Session", + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 415, + line: 18, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 434, + line: 18, + col: 30, + }, + }, + Name: "SecureCookieSession", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 435, + line: 19, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 435, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 447, + line: 19, + col: 13, + }, + }, + Name: "_NullSession", + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 450, + line: 19, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 461, + line: 19, + col: 27, + }, + }, + Name: "NullSession", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_39_src.uast b/uast/diff/testdata/testcase_39_src.uast new file mode 100644 index 00000000..d92632c7 --- /dev/null +++ b/uast/diff/testdata/testcase_39_src.uast @@ -0,0 +1,255 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 258, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask.session\n ~~~~~~~~~~~~~\n\n This module used to flask with the session global so we moved it\n over to flask.sessions\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 260, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 273, + line: 13, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "warn", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "warnings", + }, + Target: ~, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 286, + line: 14, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 286, + line: 14, + col: 1, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 291, + line: 14, + col: 6, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 310, + line: 14, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 345, + line: 14, + col: 60, + }, + }, + Format: "", + Value: "please use flask.sessions instead", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 291, + line: 14, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 309, + line: 14, + col: 24, + }, + }, + Name: "DeprecationWarning", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 286, + line: 14, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 290, + line: 14, + col: 5, + }, + }, + Name: "warn", + }, + keywords: [], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 349, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 363, + line: 16, + col: 15, + }, + }, + All: true, + Names: ~, + Path: { '@type': "uast:Identifier", + Name: "../sessions", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 18, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 381, + line: 18, + col: 8, + }, + }, + Name: "Session", + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 384, + line: 18, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 403, + line: 18, + col: 30, + }, + }, + Name: "SecureCookieSession", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 404, + line: 19, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 404, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 416, + line: 19, + col: 13, + }, + }, + Name: "_NullSession", + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 419, + line: 19, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 430, + line: 19, + col: 27, + }, + }, + Name: "NullSession", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_3_dst.uast b/uast/diff/testdata/testcase_3_dst.uast new file mode 100644 index 00000000..5e167c2e --- /dev/null +++ b/uast/diff/testdata/testcase_3_dst.uast @@ -0,0 +1,187 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "unittest", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 16, + line: 2, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "BetterLoader", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.testsuite", + }, + Target: ~, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 3, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 3, + col: 1, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 58, + line: 3, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 66, + line: 3, + col: 10, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 3, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 65, + line: 3, + col: 9, + }, + }, + Name: "unittest", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 3, + col: 1, + }, + }, + Name: "main", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "testLoader", + }, + value: { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 82, + line: 3, + col: 26, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 82, + line: 3, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 94, + line: 3, + col: 38, + }, + }, + Name: "BetterLoader", + }, + keywords: [], + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "defaultTest", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 110, + line: 3, + col: 54, + }, + end: { '@type': "uast:Position", + offset: 117, + line: 3, + col: 61, + }, + }, + Format: "", + Value: "suite", + }, + }, + ], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_3_src.uast b/uast/diff/testdata/testcase_3_src.uast new file mode 100644 index 00000000..d869f711 --- /dev/null +++ b/uast/diff/testdata/testcase_3_src.uast @@ -0,0 +1,3263 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "sys", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 11, + line: 2, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "unittest", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 27, + line: 3, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "TestLoader", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "unittest.loader", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 66, + line: 4, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "suite", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.testsuite", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 101, + line: 6, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 101, + line: 6, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 114, + line: 6, + col: 14, + }, + }, + Name: "common_prefix", + }, + ], + value: { '@type': "BinOp", + '@role': [Binary, Expression, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 117, + line: 6, + col: 17, + }, + }, + left: { '@type': "QualifiedIdentifier", + '@role': [Binary, Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 118, + line: 6, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 123, + line: 6, + col: 23, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 117, + line: 6, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 122, + line: 6, + col: 22, + }, + }, + Name: "suite", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 117, + line: 6, + col: 17, + }, + }, + Name: "__module__", + }, + ], + }, + op: { '@type': "Add", + '@token': "+", + '@role': [Add, Arithmetic, Binary, Operator], + '@pos': { '@type': "uast:Positions", + }, + }, + right: { '@type': "uast:String", + '@role': [Binary, Expression, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 122, + line: 6, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 123, + line: 6, + col: 23, + }, + }, + Format: "", + Value: ".", + }, + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 146, + line: 9, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 160, + line: 9, + col: 19, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "find_all_tests", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 168, + line: 10, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 168, + line: 10, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 174, + line: 10, + col: 11, + }, + }, + Name: "suites", + }, + ], + value: { '@type': "List", + '@role': [Expression, List, Literal, Primitive, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 177, + line: 10, + col: 14, + }, + }, + ctx: "Load", + elts: [ + { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 178, + line: 10, + col: 15, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 178, + line: 10, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 183, + line: 10, + col: 20, + }, + }, + Name: "suite", + }, + keywords: [], + }, + ], + }, + }, + { '@type': "While", + '@token': "while", + '@role': [Statement, While], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 191, + line: 11, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 196, + line: 11, + col: 10, + }, + }, + body: { '@type': "For.body", + '@role': [Body, Then, While], + 'body_stmts': [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 213, + line: 12, + col: 9, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 213, + line: 12, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 214, + line: 12, + col: 10, + }, + }, + Name: "s", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 217, + line: 12, + col: 13, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 218, + line: 12, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 224, + line: 12, + col: 20, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 217, + line: 12, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 223, + line: 12, + col: 19, + }, + }, + Name: "suites", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 217, + line: 12, + col: 13, + }, + }, + Name: "pop", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Try", + '@token': "try", + '@role': [Statement, Try], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 238, + line: 13, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 241, + line: 13, + col: 12, + }, + }, + body: { '@type': "Try.body", + '@role': [Body, Try], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 255, + line: 14, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 255, + line: 14, + col: 13, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 269, + line: 14, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 270, + line: 14, + col: 28, + }, + }, + Name: "s", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 256, + line: 14, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 262, + line: 14, + col: 20, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 255, + line: 14, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 261, + line: 14, + col: 19, + }, + }, + Name: "suites", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 255, + line: 14, + col: 13, + }, + }, + Name: "extend", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + finalbody: { '@type': "Try.finalbody", + '@token': "finally", + '@role': [Finally, Try], + 'final_stmts': [], + }, + handlers: { '@type': "Try.handlers", + '@token': "except", + '@role': [Catch, Try], + handlers: [ + { '@type': "ExceptHandler", + '@role': [Catch, Identifier, Try], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 280, + line: 15, + col: 9, + }, + }, + '@token': ~, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 310, + line: 16, + col: 13, + }, + }, + value: { '@type': "Yield", + '@token': "yield", + '@role': [Incomplete, Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 310, + line: 16, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 315, + line: 16, + col: 18, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 316, + line: 16, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 317, + line: 16, + col: 20, + }, + }, + Name: "s", + }, + }, + }, + ], + type: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 287, + line: 15, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 296, + line: 15, + col: 25, + }, + }, + Name: "TypeError", + }, + }, + ], + }, + orelse: { '@type': "Try.else", + '@token': "else", + '@role': [Else, Try], + }, + }, + ], + }, + orelse: { '@type': "For.orelse", + '@token': "else", + '@role': [Body, Else, While], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, While], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 197, + line: 11, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 203, + line: 11, + col: 17, + }, + }, + Name: "suites", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 324, + line: 19, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 348, + line: 19, + col: 29, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "find_all_tests_with_name", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "For", + '@token': "for", + '@role': [For, Iterator, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 356, + line: 20, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 359, + line: 20, + col: 8, + }, + }, + body: { '@type': "For.body", + '@role': [Body, For, Then], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 398, + line: 21, + col: 9, + }, + }, + value: { '@type': "Yield", + '@token': "yield", + '@role': [Incomplete, Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 398, + line: 21, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 403, + line: 21, + col: 14, + }, + }, + value: { '@type': "Tuple", + '@role': [Expression, Literal, Primitive, Tuple], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 404, + line: 21, + col: 15, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 404, + line: 21, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 412, + line: 21, + col: 23, + }, + }, + Name: "testcase", + }, + { '@type': "BinOp", + '@role': [Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 414, + line: 21, + col: 25, + }, + }, + left: { '@type': "uast:String", + '@role': [Binary, Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 414, + line: 21, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 424, + line: 21, + col: 35, + }, + }, + Format: "", + Value: "%s.%s.%s", + }, + op: { '@type': "Mod", + '@token': "%", + '@role': [Arithmetic, Binary, Module, Operator], + '@pos': { '@type': "uast:Positions", + }, + }, + right: { '@type': "Tuple", + '@role': [Binary, Expression, Literal, Primitive, Right, Tuple], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 441, + line: 22, + col: 13, + }, + }, + ctx: "Load", + elts: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 442, + line: 22, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 450, + line: 22, + col: 22, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 441, + line: 22, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 449, + line: 22, + col: 21, + }, + }, + Name: "testcase", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 450, + line: 22, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 459, + line: 22, + col: 31, + }, + }, + Name: "__class__", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 441, + line: 22, + col: 13, + }, + }, + Name: "__module__", + }, + ], + }, + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 485, + line: 23, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 493, + line: 23, + col: 22, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 484, + line: 23, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 492, + line: 23, + col: 21, + }, + }, + Name: "testcase", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 493, + line: 23, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 502, + line: 23, + col: 31, + }, + }, + Name: "__class__", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 484, + line: 23, + col: 13, + }, + }, + Name: "__name__", + }, + ], + }, + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 526, + line: 24, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 534, + line: 24, + col: 22, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 525, + line: 24, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 533, + line: 24, + col: 21, + }, + }, + Name: "testcase", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 525, + line: 24, + col: 13, + }, + }, + Name: "_testMethodName", + }, + ], + }, + ], + }, + }, + ], + }, + }, + }, + ], + }, + iter: { '@type': "Call", + '@role': [Call, Expression, For, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 372, + line: 20, + col: 21, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 372, + line: 20, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 386, + line: 20, + col: 35, + }, + }, + Name: "find_all_tests", + }, + keywords: [], + }, + orelse: { '@type': "For.orelse", + '@token': "else", + '@role': [Body, Else, For], + 'else_stmts': [], + }, + target: { '@type': "uast:Identifier", + '@role': [For, Update], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 360, + line: 20, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 368, + line: 20, + col: 17, + }, + }, + Name: "testcase", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "ClassDef", + '@token': "BetterLoader", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 568, + line: 28, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 580, + line: 28, + col: 19, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 581, + line: 28, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 591, + line: 28, + col: 30, + }, + }, + Name: "TestLoader", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 603, + line: 30, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 620, + line: 30, + col: 26, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "loadTestsFromName", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 655, + line: 31, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 657, + line: 31, + col: 11, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 687, + line: 32, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 693, + line: 32, + col: 19, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 694, + line: 32, + col: 20, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 694, + line: 32, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 699, + line: 32, + col: 25, + }, + }, + Name: "suite", + }, + keywords: [], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 658, + line: 31, + col: 12, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 666, + line: 31, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 673, + line: 31, + col: 27, + }, + }, + Format: "", + Value: "suite", + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 658, + line: 31, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 662, + line: 31, + col: 16, + }, + }, + Name: "name", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "For", + '@token': "for", + '@role': [For, Iterator, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 710, + line: 33, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 713, + line: 33, + col: 12, + }, + }, + body: { '@type': "For.body", + '@role': [Body, For, Then], + 'body_stmts': [ + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 776, + line: 34, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 778, + line: 34, + col: 15, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 813, + line: 35, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 819, + line: 35, + col: 23, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 820, + line: 35, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 828, + line: 35, + col: 32, + }, + }, + Name: "testcase", + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 779, + line: 34, + col: 16, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 791, + line: 34, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 795, + line: 34, + col: 32, + }, + }, + Name: "name", + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 779, + line: 34, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 787, + line: 34, + col: 24, + }, + }, + Name: "testname", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 841, + line: 36, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 843, + line: 36, + col: 15, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 896, + line: 37, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 898, + line: 37, + col: 19, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 958, + line: 38, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 964, + line: 38, + col: 27, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 965, + line: 38, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 973, + line: 38, + col: 36, + }, + }, + Name: "testcase", + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 899, + line: 37, + col: 20, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 932, + line: 37, + col: 53, + }, + end: { '@type': "uast:Position", + offset: 936, + line: 37, + col: 57, + }, + }, + Name: "name", + }, + ], + }, + left: { '@type': "Subscript", + '@role': [Expression, Incomplete, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 899, + line: 37, + col: 20, + }, + }, + ctx: "Load", + slice: { '@type': "Slice", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + lower: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 908, + line: 37, + col: 29, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 912, + line: 37, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 925, + line: 37, + col: 46, + }, + }, + Name: "common_prefix", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 908, + line: 37, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 911, + line: 37, + col: 32, + }, + }, + Name: "len", + }, + keywords: [], + }, + step: ~, + upper: ~, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 899, + line: 37, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 907, + line: 37, + col: 28, + }, + }, + Name: "testname", + }, + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Call", + '@role': [Call, Condition, Expression, Function, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 844, + line: 36, + col: 16, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 864, + line: 36, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 877, + line: 36, + col: 49, + }, + }, + Name: "common_prefix", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 845, + line: 36, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 853, + line: 36, + col: 25, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 844, + line: 36, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 852, + line: 36, + col: 24, + }, + }, + Name: "testname", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 844, + line: 36, + col: 16, + }, + }, + Name: "startswith", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + iter: { '@type': "Call", + '@role': [Call, Expression, For, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 736, + line: 33, + col: 35, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 736, + line: 33, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 760, + line: 33, + col: 59, + }, + }, + Name: "find_all_tests_with_name", + }, + keywords: [], + }, + orelse: { '@type': "For.orelse", + '@token': "else", + '@role': [Body, Else, For], + 'else_stmts': [], + }, + target: { '@type': "Tuple", + '@role': [Expression, For, Literal, Primitive, Tuple, Update], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 714, + line: 33, + col: 13, + }, + }, + ctx: "Store", + elts: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 714, + line: 33, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 722, + line: 33, + col: 21, + }, + }, + Name: "testcase", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 724, + line: 33, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 732, + line: 33, + col: 31, + }, + }, + Name: "testname", + }, + ], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 983, + line: 40, + col: 9, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 983, + line: 40, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 992, + line: 40, + col: 18, + }, + }, + Name: "all_tests", + }, + ], + value: { '@type': "List", + '@role': [Expression, List, Literal, Primitive, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 995, + line: 40, + col: 21, + }, + }, + ctx: "Load", + elts: [], + }, + }, + { '@type': "For", + '@token': "for", + '@role': [For, Iterator, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1006, + line: 41, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1009, + line: 41, + col: 12, + }, + }, + body: { '@type': "For.body", + '@role': [Body, For, Then], + 'body_stmts': [ + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1072, + line: 42, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1074, + line: 42, + col: 15, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1208, + line: 44, + col: 17, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1208, + line: 44, + col: 17, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1225, + line: 44, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 1233, + line: 44, + col: 42, + }, + }, + Name: "testcase", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1209, + line: 44, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 1218, + line: 44, + col: 27, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1208, + line: 44, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 1217, + line: 44, + col: 26, + }, + }, + Name: "all_tests", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1208, + line: 44, + col: 17, + }, + }, + Name: "append", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "BoolOp", + '@role': [Boolean, Condition, If, Incomplete, Literal], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1075, + line: 42, + col: 16, + }, + }, + op: { '@type': "Or", + '@token': "or", + '@role': [Boolean, Operator, Or], + '@pos': { '@type': "uast:Positions", + }, + }, + values: [ + { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1075, + line: 42, + col: 16, + }, + }, + args: [ + { '@type': "BinOp", + '@role': [Argument, Binary, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1093, + line: 42, + col: 34, + }, + }, + left: { '@type': "uast:String", + '@role': [Binary, Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1083, + line: 42, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 1084, + line: 42, + col: 25, + }, + }, + Format: "", + Value: ".", + }, + op: { '@type': "Add", + '@token': "+", + '@role': [Add, Arithmetic, Binary, Operator], + '@pos': { '@type': "uast:Positions", + }, + }, + right: { '@type': "uast:Identifier", + '@role': [Binary, Expression, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1099, + line: 42, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 1103, + line: 42, + col: 44, + }, + }, + Name: "name", + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1076, + line: 42, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 1084, + line: 42, + col: 25, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1075, + line: 42, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 1083, + line: 42, + col: 24, + }, + }, + Name: "testname", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1075, + line: 42, + col: 16, + }, + }, + Name: "endswith", + }, + ], + }, + keywords: [], + }, + { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1108, + line: 42, + col: 49, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1130, + line: 42, + col: 71, + }, + end: { '@type': "uast:Position", + offset: 1138, + line: 42, + col: 79, + }, + }, + Name: "testname", + }, + ], + }, + left: { '@type': "BinOp", + '@role': [Binary, Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1120, + line: 42, + col: 61, + }, + }, + left: { '@type': "BinOp", + '@role': [Binary, Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1109, + line: 42, + col: 50, + }, + }, + left: { '@type': "uast:String", + '@role': [Binary, Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1093, + line: 42, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 1096, + line: 42, + col: 37, + }, + }, + Format: "", + Value: ".", + }, + op: { '@type': "Add", + '@token': "+", + '@role': [Add, Arithmetic, Binary, Operator], + '@pos': { '@type': "uast:Positions", + }, + }, + right: { '@type': "uast:Identifier", + '@role': [Binary, Expression, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1115, + line: 42, + col: 56, + }, + end: { '@type': "uast:Position", + offset: 1119, + line: 42, + col: 60, + }, + }, + Name: "name", + }, + }, + op: { '@type': "Add", + '@token': "+", + '@role': [Add, Arithmetic, Binary, Operator], + '@pos': { '@type': "uast:Positions", + }, + }, + right: { '@type': "uast:String", + '@role': [Binary, Expression, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1109, + line: 42, + col: 50, + }, + end: { '@type': "uast:Position", + offset: 1112, + line: 42, + col: 53, + }, + }, + Format: "", + Value: ".", + }, + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "In", + '@token': "in", + '@role': [Contains, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1159, + line: 43, + col: 16, + }, + }, + args: [ + { '@type': "BinOp", + '@role': [Argument, Binary, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1179, + line: 43, + col: 36, + }, + }, + left: { '@type': "uast:Identifier", + '@role': [Binary, Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1179, + line: 43, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 1183, + line: 43, + col: 40, + }, + }, + Name: "name", + }, + op: { '@type': "Add", + '@token': "+", + '@role': [Add, Arithmetic, Binary, Operator], + '@pos': { '@type': "uast:Positions", + }, + }, + right: { '@type': "uast:String", + '@role': [Binary, Expression, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1167, + line: 43, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 1168, + line: 43, + col: 25, + }, + }, + Format: "", + Value: ".", + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1160, + line: 43, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 1168, + line: 43, + col: 25, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1159, + line: 43, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 1167, + line: 43, + col: 24, + }, + }, + Name: "testname", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1159, + line: 43, + col: 16, + }, + }, + Name: "startswith", + }, + ], + }, + keywords: [], + }, + ], + }, + }, + ], + }, + iter: { '@type': "Call", + '@role': [Call, Expression, For, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1032, + line: 41, + col: 35, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1032, + line: 41, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 1056, + line: 41, + col: 59, + }, + }, + Name: "find_all_tests_with_name", + }, + keywords: [], + }, + orelse: { '@type': "For.orelse", + '@token': "else", + '@role': [Body, Else, For], + 'else_stmts': [], + }, + target: { '@type': "Tuple", + '@role': [Expression, For, Literal, Primitive, Tuple, Update], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1010, + line: 41, + col: 13, + }, + }, + ctx: "Store", + elts: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1010, + line: 41, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1018, + line: 41, + col: 21, + }, + }, + Name: "testcase", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1020, + line: 41, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 1028, + line: 41, + col: 31, + }, + }, + Name: "testname", + }, + ], + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1244, + line: 46, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1246, + line: 46, + col: 11, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1274, + line: 47, + col: 13, + }, + }, + value: { '@type': "Tuple", + '@role': [Expression, Literal, Primitive, Tuple], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1274, + line: 47, + col: 13, + }, + }, + ctx: "Load", + elts: [ + { '@type': "BinOp", + '@role': [Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1274, + line: 47, + col: 13, + }, + }, + left: { '@type': "uast:Identifier", + '@role': [Binary, Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1274, + line: 47, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1279, + line: 47, + col: 18, + }, + }, + Name: "print", + }, + op: { '@type': "RShift", + '@token': ">>", + '@role': [Binary, Bitwise, Operator, RightShift], + '@pos': { '@type': "uast:Positions", + }, + }, + right: { '@type': "QualifiedIdentifier", + '@role': [Binary, Expression, Identifier, Qualified, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1284, + line: 47, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 1287, + line: 47, + col: 26, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1283, + line: 47, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 1286, + line: 47, + col: 25, + }, + }, + Name: "sys", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1283, + line: 47, + col: 22, + }, + }, + Name: "stderr", + }, + ], + }, + }, + { '@type': "BinOp", + '@role': [Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1295, + line: 47, + col: 34, + }, + }, + left: { '@type': "uast:String", + '@role': [Binary, Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1295, + line: 47, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 1337, + line: 47, + col: 76, + }, + }, + Format: "", + Value: "Error: could not find test case for \"%s\"", + }, + op: { '@type': "Mod", + '@token': "%", + '@role': [Arithmetic, Binary, Module, Operator], + '@pos': { '@type': "uast:Positions", + }, + }, + right: { '@type': "uast:Identifier", + '@role': [Binary, Expression, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1340, + line: 47, + col: 79, + }, + end: { '@type': "uast:Position", + offset: 1344, + line: 47, + col: 83, + }, + }, + Name: "name", + }, + }, + ], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1357, + line: 48, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1357, + line: 48, + col: 13, + }, + }, + args: [ + { '@type': "Num", + '@token': 1, + '@role': [Argument, Call, Expression, Function, Literal, Name, Number, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1366, + line: 48, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 1367, + line: 48, + col: 23, + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1358, + line: 48, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 1361, + line: 48, + col: 17, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1357, + line: 48, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1360, + line: 48, + col: 16, + }, + }, + Name: "sys", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1357, + line: 48, + col: 13, + }, + }, + Name: "exit", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "UnaryOp", + '@role': [Boolean, Condition, Expression, If, Operator, Unary], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1247, + line: 46, + col: 12, + }, + }, + op: { '@type': "Not", + '@token': "not", + '@role': [Boolean, Not, Operator], + '@pos': { '@type': "uast:Positions", + }, + }, + operand: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1251, + line: 46, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 1260, + line: 46, + col: 25, + }, + }, + Name: "all_tests", + }, + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1378, + line: 50, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1380, + line: 50, + col: 11, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1414, + line: 51, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1420, + line: 51, + col: 19, + }, + }, + value: { '@type': "Subscript", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1421, + line: 51, + col: 20, + }, + }, + ctx: "Load", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "Num", + '@token': 0, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1431, + line: 51, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 1432, + line: 51, + col: 31, + }, + }, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1421, + line: 51, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 1430, + line: 51, + col: 29, + }, + }, + Name: "all_tests", + }, + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1381, + line: 50, + col: 12, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "Num", + '@token': 1, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1399, + line: 50, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 1400, + line: 50, + col: 31, + }, + }, + }, + ], + }, + left: { '@type': "Call", + '@role': [Call, Expression, Function, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1381, + line: 50, + col: 12, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1385, + line: 50, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 1394, + line: 50, + col: 25, + }, + }, + Name: "all_tests", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1381, + line: 50, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 1384, + line: 50, + col: 15, + }, + }, + Name: "len", + }, + keywords: [], + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1442, + line: 52, + col: 9, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1442, + line: 52, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1444, + line: 52, + col: 11, + }, + }, + Name: "rv", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1447, + line: 52, + col: 14, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1448, + line: 52, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 1456, + line: 52, + col: 23, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1447, + line: 52, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 1455, + line: 52, + col: 22, + }, + }, + Name: "unittest", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1447, + line: 52, + col: 14, + }, + }, + Name: "TestSuite", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "For", + '@token': "for", + '@role': [For, Iterator, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1476, + line: 53, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1479, + line: 53, + col: 12, + }, + }, + body: { '@type': "For.body", + '@role': [Body, For, Then], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1511, + line: 54, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1511, + line: 54, + col: 13, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1522, + line: 54, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 1526, + line: 54, + col: 28, + }, + }, + Name: "test", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1512, + line: 54, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 1514, + line: 54, + col: 16, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1511, + line: 54, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1513, + line: 54, + col: 15, + }, + }, + Name: "rv", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1511, + line: 54, + col: 13, + }, + }, + Name: "addTest", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + iter: { '@type': "uast:Identifier", + '@role': [Expression, For], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1488, + line: 53, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 1497, + line: 53, + col: 30, + }, + }, + Name: "all_tests", + }, + orelse: { '@type': "For.orelse", + '@token': "else", + '@role': [Body, Else, For], + 'else_stmts': [], + }, + target: { '@type': "uast:Identifier", + '@role': [For, Update], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1480, + line: 53, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1484, + line: 53, + col: 17, + }, + }, + Name: "test", + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1536, + line: 55, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1542, + line: 55, + col: 15, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1543, + line: 55, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 1545, + line: 55, + col: 18, + }, + }, + Name: "rv", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 621, + line: 30, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 625, + line: 30, + col: 31, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 621, + line: 30, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 625, + line: 30, + col: 31, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 627, + line: 30, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 631, + line: 30, + col: 37, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 627, + line: 30, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 631, + line: 30, + col: 37, + }, + }, + Name: "name", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 633, + line: 30, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 639, + line: 30, + col: 45, + }, + }, + Init: { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 640, + line: 30, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 644, + line: 30, + col: 50, + }, + }, + LiteralValue: "None", + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 594, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 594, + line: 29, + col: 1, + }, + }, + lines: [], + }, + value: ~, + }, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 633, + line: 30, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 639, + line: 30, + col: 45, + }, + }, + Name: "module", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1548, + line: 58, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1548, + line: 58, + col: 1, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1549, + line: 58, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 1557, + line: 58, + col: 10, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1548, + line: 58, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1556, + line: 58, + col: 9, + }, + }, + Name: "unittest", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1548, + line: 58, + col: 1, + }, + }, + Name: "main", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "testLoader", + }, + value: { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1573, + line: 58, + col: 26, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1573, + line: 58, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 1585, + line: 58, + col: 38, + }, + }, + Name: "BetterLoader", + }, + keywords: [], + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "defaultTest", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1601, + line: 58, + col: 54, + }, + end: { '@type': "uast:Position", + offset: 1608, + line: 58, + col: 61, + }, + }, + Format: "", + Value: "suite", + }, + }, + ], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_40_dst.uast b/uast/diff/testdata/testcase_40_dst.uast new file mode 100644 index 00000000..ab914d3a --- /dev/null +++ b/uast/diff/testdata/testcase_40_dst.uast @@ -0,0 +1,419 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 15, + line: 1, + col: 16, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "setup", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "setuptools", + }, + Target: ~, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 31, + line: 4, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 31, + line: 4, + col: 1, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 31, + line: 4, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 36, + line: 4, + col: 6, + }, + }, + Name: "setup", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "name", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 47, + line: 5, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 54, + line: 5, + col: 17, + }, + }, + Format: "", + Value: "Flask", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "version", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 68, + line: 6, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 73, + line: 6, + col: 18, + }, + }, + Format: "", + Value: "0.1", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "url", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 83, + line: 7, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 119, + line: 7, + col: 45, + }, + }, + Format: "", + Value: "http://github.com/mitsuhiko/flask/", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "license", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 133, + line: 8, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 138, + line: 8, + col: 18, + }, + }, + Format: "", + Value: "BSD", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "author", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 151, + line: 9, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 167, + line: 9, + col: 28, + }, + }, + Format: "", + Value: "Armin Ronacher", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "author_email", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 186, + line: 10, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 215, + line: 10, + col: 47, + }, + }, + Format: "", + Value: "armin.ronacher@active-4.com", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "description", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 233, + line: 11, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 297, + line: 11, + col: 81, + }, + }, + Format: "", + Value: "A microframework based on Werkzeug, Jinja2 and good intentions", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "modules", + }, + value: { '@type': "List", + '@role': [Argument, Expression, List, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 311, + line: 12, + col: 13, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 312, + line: 12, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 319, + line: 12, + col: 21, + }, + }, + Format: "", + Value: "flask", + }, + ], + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "zip_safe", + }, + value: { '@type': "BoolLiteral", + '@token': "False", + '@role': [Argument, Boolean, Expression, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 335, + line: 13, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 340, + line: 13, + col: 19, + }, + }, + value: false, + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "platforms", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 356, + line: 14, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 361, + line: 14, + col: 20, + }, + }, + Format: "", + Value: "any", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "install_requires", + }, + value: { '@type': "List", + '@role': [Argument, Expression, List, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 384, + line: 15, + col: 22, + }, + }, + ctx: "Load", + elts: [], + }, + }, + ], + }, + }, + ], + 'noops_remainder': { '@type': "RemainderNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 386, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 460, + line: 18, + col: 1, + }, + }, + lines: [ + { '@type': "uast:Comment", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 386, + line: 16, + col: 1, + }, + }, + Block: false, + Prefix: "# ", + Suffix: "\n", + Tab: "", + Text: "disabled until release, install yourself", + }, + { '@type': "uast:Comment", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 438, + line: 17, + col: 1, + }, + }, + Block: false, + Prefix: " '", + Suffix: "\n", + Tab: "", + Text: "Werkzeug',", + }, + { '@type': "uast:Comment", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 460, + line: 18, + col: 1, + }, + }, + Block: false, + Prefix: " '", + Suffix: "\n", + Tab: "", + Text: "Jinja2'", + }, + ], + }, +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_40_src.uast b/uast/diff/testdata/testcase_40_src.uast new file mode 100644 index 00000000..5b66c62b --- /dev/null +++ b/uast/diff/testdata/testcase_40_src.uast @@ -0,0 +1,416 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 15, + line: 1, + col: 16, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "setup", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "setuptools", + }, + Target: ~, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 31, + line: 4, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 31, + line: 4, + col: 1, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 31, + line: 4, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 36, + line: 4, + col: 6, + }, + }, + Name: "setup", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "name", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 47, + line: 5, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 54, + line: 5, + col: 17, + }, + }, + Format: "", + Value: "Flask", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "version", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 68, + line: 6, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 73, + line: 6, + col: 18, + }, + }, + Format: "", + Value: "0.1", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "url", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 83, + line: 7, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 119, + line: 7, + col: 45, + }, + }, + Format: "", + Value: "http://github.com/mitsuhiko/flask/", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "license", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 133, + line: 8, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 138, + line: 8, + col: 18, + }, + }, + Format: "", + Value: "BSD", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "author", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 151, + line: 9, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 167, + line: 9, + col: 28, + }, + }, + Format: "", + Value: "Armin Ronacher", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "author_email", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 186, + line: 10, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 215, + line: 10, + col: 47, + }, + }, + Format: "", + Value: "armin.ronacher@active-4.com", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "description", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 233, + line: 11, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 297, + line: 11, + col: 81, + }, + }, + Format: "", + Value: "A microframework based on Werkzeug, Jinja2 and good intentions", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "modules", + }, + value: { '@type': "List", + '@role': [Argument, Expression, List, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 311, + line: 12, + col: 13, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 312, + line: 12, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 319, + line: 12, + col: 21, + }, + }, + Format: "", + Value: "flask", + }, + ], + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "zip_safe", + }, + value: { '@type': "BoolLiteral", + '@token': "False", + '@role': [Argument, Boolean, Expression, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 335, + line: 13, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 340, + line: 13, + col: 19, + }, + }, + value: false, + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "platforms", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 356, + line: 14, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 361, + line: 14, + col: 20, + }, + }, + Format: "", + Value: "any", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "install_requires", + }, + value: { '@type': "List", + '@role': [Argument, Expression, List, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 384, + line: 15, + col: 22, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 444, + line: 16, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 459, + line: 16, + col: 24, + }, + }, + Format: "", + Value: "Werkzeug==dev", + }, + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 469, + line: 17, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 482, + line: 17, + col: 22, + }, + }, + Format: "", + Value: "Jinja2==dev", + }, + ], + 'noops_sameline': { '@type': "SameLineNoops", + '@role': [Comment], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 385, + line: 15, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 434, + line: 15, + col: 72, + }, + }, + 'noop_lines': [ + { '@type': "uast:Comment", + '@pos': { '@type': "uast:Positions", + }, + Block: false, + Prefix: "# ", + Suffix: "", + Tab: "", + Text: "yes, as of now we need the development versions", + }, + ], + }, + }, + }, + ], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_41_dst.uast b/uast/diff/testdata/testcase_41_dst.uast new file mode 100644 index 00000000..84b34cd6 --- /dev/null +++ b/uast/diff/testdata/testcase_41_dst.uast @@ -0,0 +1,419 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 15, + line: 1, + col: 16, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "setup", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "setuptools", + }, + Target: ~, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 31, + line: 4, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 31, + line: 4, + col: 1, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 31, + line: 4, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 36, + line: 4, + col: 6, + }, + }, + Name: "setup", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "name", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 47, + line: 5, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 54, + line: 5, + col: 17, + }, + }, + Format: "", + Value: "Flask", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "version", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 68, + line: 6, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 73, + line: 6, + col: 18, + }, + }, + Format: "", + Value: "0.1", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "url", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 83, + line: 7, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 119, + line: 7, + col: 45, + }, + }, + Format: "", + Value: "http://github.com/mitsuhiko/flask/", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "license", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 133, + line: 8, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 138, + line: 8, + col: 18, + }, + }, + Format: "", + Value: "BSD", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "author", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 151, + line: 9, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 167, + line: 9, + col: 28, + }, + }, + Format: "", + Value: "Armin Ronacher", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "author_email", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 186, + line: 10, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 215, + line: 10, + col: 47, + }, + }, + Format: "", + Value: "armin.ronacher@active-4.com", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "description", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 233, + line: 11, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 297, + line: 11, + col: 81, + }, + }, + Format: "", + Value: "A microframework based on Werkzeug, Jinja2 and good intentions", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "py_modules", + }, + value: { '@type': "List", + '@role': [Argument, Expression, List, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 314, + line: 12, + col: 16, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 315, + line: 12, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 322, + line: 12, + col: 24, + }, + }, + Format: "", + Value: "flask", + }, + ], + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "zip_safe", + }, + value: { '@type': "BoolLiteral", + '@token': "False", + '@role': [Argument, Boolean, Expression, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 338, + line: 13, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 343, + line: 13, + col: 19, + }, + }, + value: false, + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "platforms", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 359, + line: 14, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 364, + line: 14, + col: 20, + }, + }, + Format: "", + Value: "any", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "install_requires", + }, + value: { '@type': "List", + '@role': [Argument, Expression, List, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 387, + line: 15, + col: 22, + }, + }, + ctx: "Load", + elts: [], + }, + }, + ], + }, + }, + ], + 'noops_remainder': { '@type': "RemainderNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 389, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 463, + line: 18, + col: 1, + }, + }, + lines: [ + { '@type': "uast:Comment", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 389, + line: 16, + col: 1, + }, + }, + Block: false, + Prefix: "# ", + Suffix: "\n", + Tab: "", + Text: "disabled until release, install yourself", + }, + { '@type': "uast:Comment", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 441, + line: 17, + col: 1, + }, + }, + Block: false, + Prefix: " '", + Suffix: "\n", + Tab: "", + Text: "Werkzeug',", + }, + { '@type': "uast:Comment", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 463, + line: 18, + col: 1, + }, + }, + Block: false, + Prefix: " '", + Suffix: "\n", + Tab: "", + Text: "Jinja2'", + }, + ], + }, +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_41_src.uast b/uast/diff/testdata/testcase_41_src.uast new file mode 100644 index 00000000..ab914d3a --- /dev/null +++ b/uast/diff/testdata/testcase_41_src.uast @@ -0,0 +1,419 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 15, + line: 1, + col: 16, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "setup", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "setuptools", + }, + Target: ~, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 31, + line: 4, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 31, + line: 4, + col: 1, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 31, + line: 4, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 36, + line: 4, + col: 6, + }, + }, + Name: "setup", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "name", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 47, + line: 5, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 54, + line: 5, + col: 17, + }, + }, + Format: "", + Value: "Flask", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "version", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 68, + line: 6, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 73, + line: 6, + col: 18, + }, + }, + Format: "", + Value: "0.1", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "url", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 83, + line: 7, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 119, + line: 7, + col: 45, + }, + }, + Format: "", + Value: "http://github.com/mitsuhiko/flask/", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "license", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 133, + line: 8, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 138, + line: 8, + col: 18, + }, + }, + Format: "", + Value: "BSD", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "author", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 151, + line: 9, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 167, + line: 9, + col: 28, + }, + }, + Format: "", + Value: "Armin Ronacher", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "author_email", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 186, + line: 10, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 215, + line: 10, + col: 47, + }, + }, + Format: "", + Value: "armin.ronacher@active-4.com", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "description", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 233, + line: 11, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 297, + line: 11, + col: 81, + }, + }, + Format: "", + Value: "A microframework based on Werkzeug, Jinja2 and good intentions", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "modules", + }, + value: { '@type': "List", + '@role': [Argument, Expression, List, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 311, + line: 12, + col: 13, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 312, + line: 12, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 319, + line: 12, + col: 21, + }, + }, + Format: "", + Value: "flask", + }, + ], + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "zip_safe", + }, + value: { '@type': "BoolLiteral", + '@token': "False", + '@role': [Argument, Boolean, Expression, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 335, + line: 13, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 340, + line: 13, + col: 19, + }, + }, + value: false, + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "platforms", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 356, + line: 14, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 361, + line: 14, + col: 20, + }, + }, + Format: "", + Value: "any", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "install_requires", + }, + value: { '@type': "List", + '@role': [Argument, Expression, List, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 384, + line: 15, + col: 22, + }, + }, + ctx: "Load", + elts: [], + }, + }, + ], + }, + }, + ], + 'noops_remainder': { '@type': "RemainderNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 386, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 460, + line: 18, + col: 1, + }, + }, + lines: [ + { '@type': "uast:Comment", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 386, + line: 16, + col: 1, + }, + }, + Block: false, + Prefix: "# ", + Suffix: "\n", + Tab: "", + Text: "disabled until release, install yourself", + }, + { '@type': "uast:Comment", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 438, + line: 17, + col: 1, + }, + }, + Block: false, + Prefix: " '", + Suffix: "\n", + Tab: "", + Text: "Werkzeug',", + }, + { '@type': "uast:Comment", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 460, + line: 18, + col: 1, + }, + }, + Block: false, + Prefix: " '", + Suffix: "\n", + Tab: "", + Text: "Jinja2'", + }, + ], + }, +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_42_dst.uast b/uast/diff/testdata/testcase_42_dst.uast new file mode 100644 index 00000000..5f515f47 --- /dev/null +++ b/uast/diff/testdata/testcase_42_dst.uast @@ -0,0 +1,682 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 246, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 249, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask.globals\n ~~~~~~~~~~~~~\n\n Defines all the global objects that are proxies to the current\n active context.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 251, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 264, + line: 13, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "LocalStack", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "LocalProxy", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 313, + line: 16, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 313, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 331, + line: 16, + col: 19, + }, + }, + Name: "_request_ctx_stack", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 334, + line: 16, + col: 22, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 334, + line: 16, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 344, + line: 16, + col: 32, + }, + }, + Name: "LocalStack", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 347, + line: 17, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 347, + line: 17, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 358, + line: 17, + col: 12, + }, + }, + Name: "current_app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 361, + line: 17, + col: 15, + }, + }, + args: [ + { '@type': "Lambda", + '@role': [Anonymous, Argument, Call, Declaration, Function, Name, Positional, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 372, + line: 17, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 378, + line: 17, + col: 32, + }, + }, + args: { '@type': "arguments", + '@role': [Argument, Declaration, Function, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + args: [], + }, + body: { '@type': "FunctionDef.body", + '@role': [Body, Declaration, Function], + 'body_stmts': { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 381, + line: 17, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 399, + line: 17, + col: 53, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 380, + line: 17, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 398, + line: 17, + col: 52, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 399, + line: 17, + col: 53, + }, + end: { '@type': "uast:Position", + offset: 402, + line: 17, + col: 56, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 380, + line: 17, + col: 34, + }, + }, + Name: "app", + }, + ], + }, + }, + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 361, + line: 17, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 371, + line: 17, + col: 25, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 408, + line: 18, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 408, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 415, + line: 18, + col: 8, + }, + }, + Name: "request", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 418, + line: 18, + col: 11, + }, + }, + args: [ + { '@type': "Lambda", + '@role': [Anonymous, Argument, Call, Declaration, Function, Name, Positional, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 429, + line: 18, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 435, + line: 18, + col: 28, + }, + }, + args: { '@type': "arguments", + '@role': [Argument, Declaration, Function, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + args: [], + }, + body: { '@type': "FunctionDef.body", + '@role': [Body, Declaration, Function], + 'body_stmts': { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 438, + line: 18, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 456, + line: 18, + col: 49, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 437, + line: 18, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 455, + line: 18, + col: 48, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 456, + line: 18, + col: 49, + }, + end: { '@type': "uast:Position", + offset: 459, + line: 18, + col: 52, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 437, + line: 18, + col: 30, + }, + }, + Name: "request", + }, + ], + }, + }, + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 418, + line: 18, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 428, + line: 18, + col: 21, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 469, + line: 19, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 469, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 476, + line: 19, + col: 8, + }, + }, + Name: "session", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 479, + line: 19, + col: 11, + }, + }, + args: [ + { '@type': "Lambda", + '@role': [Anonymous, Argument, Call, Declaration, Function, Name, Positional, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 490, + line: 19, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 496, + line: 19, + col: 28, + }, + }, + args: { '@type': "arguments", + '@role': [Argument, Declaration, Function, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + args: [], + }, + body: { '@type': "FunctionDef.body", + '@role': [Body, Declaration, Function], + 'body_stmts': { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 499, + line: 19, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 517, + line: 19, + col: 49, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 498, + line: 19, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 516, + line: 19, + col: 48, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 517, + line: 19, + col: 49, + }, + end: { '@type': "uast:Position", + offset: 520, + line: 19, + col: 52, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 498, + line: 19, + col: 30, + }, + }, + Name: "session", + }, + ], + }, + }, + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 479, + line: 19, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 489, + line: 19, + col: 21, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 530, + line: 20, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 530, + line: 20, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 531, + line: 20, + col: 2, + }, + }, + Name: "g", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 534, + line: 20, + col: 5, + }, + }, + args: [ + { '@type': "Lambda", + '@role': [Anonymous, Argument, Call, Declaration, Function, Name, Positional, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 545, + line: 20, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 551, + line: 20, + col: 22, + }, + }, + args: { '@type': "arguments", + '@role': [Argument, Declaration, Function, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + args: [], + }, + body: { '@type': "FunctionDef.body", + '@role': [Body, Declaration, Function], + 'body_stmts': { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 554, + line: 20, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 572, + line: 20, + col: 43, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 553, + line: 20, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 571, + line: 20, + col: 42, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 572, + line: 20, + col: 43, + }, + end: { '@type': "uast:Position", + offset: 575, + line: 20, + col: 46, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 553, + line: 20, + col: 24, + }, + }, + Name: "g", + }, + ], + }, + }, + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 534, + line: 20, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 544, + line: 20, + col: 15, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_42_src.uast b/uast/diff/testdata/testcase_42_src.uast new file mode 100644 index 00000000..f00b378d --- /dev/null +++ b/uast/diff/testdata/testcase_42_src.uast @@ -0,0 +1,656 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 13, + line: 1, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "LocalStack", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "LocalProxy", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 62, + line: 4, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 62, + line: 4, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 80, + line: 4, + col: 19, + }, + }, + Name: "_request_ctx_stack", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 83, + line: 4, + col: 22, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 83, + line: 4, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 93, + line: 4, + col: 32, + }, + }, + Name: "LocalStack", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 96, + line: 5, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 96, + line: 5, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 107, + line: 5, + col: 12, + }, + }, + Name: "current_app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 110, + line: 5, + col: 15, + }, + }, + args: [ + { '@type': "Lambda", + '@role': [Anonymous, Argument, Call, Declaration, Function, Name, Positional, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 121, + line: 5, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 127, + line: 5, + col: 32, + }, + }, + args: { '@type': "arguments", + '@role': [Argument, Declaration, Function, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + args: [], + }, + body: { '@type': "FunctionDef.body", + '@role': [Body, Declaration, Function], + 'body_stmts': { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 130, + line: 5, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 148, + line: 5, + col: 53, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 129, + line: 5, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 147, + line: 5, + col: 52, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 148, + line: 5, + col: 53, + }, + end: { '@type': "uast:Position", + offset: 151, + line: 5, + col: 56, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 129, + line: 5, + col: 34, + }, + }, + Name: "app", + }, + ], + }, + }, + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 110, + line: 5, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 120, + line: 5, + col: 25, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 157, + line: 6, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 157, + line: 6, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 164, + line: 6, + col: 8, + }, + }, + Name: "request", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 167, + line: 6, + col: 11, + }, + }, + args: [ + { '@type': "Lambda", + '@role': [Anonymous, Argument, Call, Declaration, Function, Name, Positional, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 178, + line: 6, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 184, + line: 6, + col: 28, + }, + }, + args: { '@type': "arguments", + '@role': [Argument, Declaration, Function, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + args: [], + }, + body: { '@type': "FunctionDef.body", + '@role': [Body, Declaration, Function], + 'body_stmts': { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 187, + line: 6, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 205, + line: 6, + col: 49, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 186, + line: 6, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 204, + line: 6, + col: 48, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 205, + line: 6, + col: 49, + }, + end: { '@type': "uast:Position", + offset: 208, + line: 6, + col: 52, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 186, + line: 6, + col: 30, + }, + }, + Name: "request", + }, + ], + }, + }, + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 167, + line: 6, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 177, + line: 6, + col: 21, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 218, + line: 7, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 218, + line: 7, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 225, + line: 7, + col: 8, + }, + }, + Name: "session", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 228, + line: 7, + col: 11, + }, + }, + args: [ + { '@type': "Lambda", + '@role': [Anonymous, Argument, Call, Declaration, Function, Name, Positional, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 239, + line: 7, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 245, + line: 7, + col: 28, + }, + }, + args: { '@type': "arguments", + '@role': [Argument, Declaration, Function, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + args: [], + }, + body: { '@type': "FunctionDef.body", + '@role': [Body, Declaration, Function], + 'body_stmts': { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 248, + line: 7, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 266, + line: 7, + col: 49, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 247, + line: 7, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 265, + line: 7, + col: 48, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 266, + line: 7, + col: 49, + }, + end: { '@type': "uast:Position", + offset: 269, + line: 7, + col: 52, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 247, + line: 7, + col: 30, + }, + }, + Name: "session", + }, + ], + }, + }, + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 228, + line: 7, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 238, + line: 7, + col: 21, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 279, + line: 8, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 279, + line: 8, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 280, + line: 8, + col: 2, + }, + }, + Name: "g", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 283, + line: 8, + col: 5, + }, + }, + args: [ + { '@type': "Lambda", + '@role': [Anonymous, Argument, Call, Declaration, Function, Name, Positional, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 294, + line: 8, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 300, + line: 8, + col: 22, + }, + }, + args: { '@type': "arguments", + '@role': [Argument, Declaration, Function, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + args: [], + }, + body: { '@type': "FunctionDef.body", + '@role': [Body, Declaration, Function], + 'body_stmts': { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 303, + line: 8, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 321, + line: 8, + col: 43, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 302, + line: 8, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 320, + line: 8, + col: 42, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 321, + line: 8, + col: 43, + }, + end: { '@type': "uast:Position", + offset: 324, + line: 8, + col: 46, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 302, + line: 8, + col: 24, + }, + }, + Name: "g", + }, + ], + }, + }, + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 283, + line: 8, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 293, + line: 8, + col: 15, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_43_dst.uast b/uast/diff/testdata/testcase_43_dst.uast new file mode 100644 index 00000000..bba29577 --- /dev/null +++ b/uast/diff/testdata/testcase_43_dst.uast @@ -0,0 +1,390 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 15, + line: 1, + col: 16, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "setup", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "setuptools", + }, + Target: ~, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 31, + line: 4, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 31, + line: 4, + col: 1, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 31, + line: 4, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 36, + line: 4, + col: 6, + }, + }, + Name: "setup", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "name", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 47, + line: 5, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 54, + line: 5, + col: 17, + }, + }, + Format: "", + Value: "Flask", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "version", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 68, + line: 6, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 73, + line: 6, + col: 18, + }, + }, + Format: "", + Value: "0.1", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "url", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 83, + line: 7, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 119, + line: 7, + col: 45, + }, + }, + Format: "", + Value: "http://github.com/mitsuhiko/flask/", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "license", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 133, + line: 8, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 138, + line: 8, + col: 18, + }, + }, + Format: "", + Value: "BSD", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "author", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 151, + line: 9, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 167, + line: 9, + col: 28, + }, + }, + Format: "", + Value: "Armin Ronacher", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "author_email", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 186, + line: 10, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 215, + line: 10, + col: 47, + }, + }, + Format: "", + Value: "armin.ronacher@active-4.com", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "description", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 233, + line: 11, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 297, + line: 11, + col: 81, + }, + }, + Format: "", + Value: "A microframework based on Werkzeug, Jinja2 and good intentions", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "py_modules", + }, + value: { '@type': "List", + '@role': [Argument, Expression, List, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 314, + line: 12, + col: 16, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 315, + line: 12, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 322, + line: 12, + col: 24, + }, + }, + Format: "", + Value: "flask", + }, + ], + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "zip_safe", + }, + value: { '@type': "BoolLiteral", + '@token': "False", + '@role': [Argument, Boolean, Expression, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 338, + line: 13, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 343, + line: 13, + col: 19, + }, + }, + value: false, + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "platforms", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 359, + line: 14, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 364, + line: 14, + col: 20, + }, + }, + Format: "", + Value: "any", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "install_requires", + }, + value: { '@type': "List", + '@role': [Argument, Expression, List, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 387, + line: 15, + col: 22, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 397, + line: 16, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 414, + line: 16, + col: 26, + }, + }, + Format: "", + Value: "Werkzeug>=0.6.1", + }, + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 424, + line: 17, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 437, + line: 17, + col: 22, + }, + }, + Format: "", + Value: "Jinja2>=2.4", + }, + ], + }, + }, + ], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_43_src.uast b/uast/diff/testdata/testcase_43_src.uast new file mode 100644 index 00000000..84b34cd6 --- /dev/null +++ b/uast/diff/testdata/testcase_43_src.uast @@ -0,0 +1,419 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 15, + line: 1, + col: 16, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "setup", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "setuptools", + }, + Target: ~, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 31, + line: 4, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 31, + line: 4, + col: 1, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 31, + line: 4, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 36, + line: 4, + col: 6, + }, + }, + Name: "setup", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "name", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 47, + line: 5, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 54, + line: 5, + col: 17, + }, + }, + Format: "", + Value: "Flask", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "version", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 68, + line: 6, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 73, + line: 6, + col: 18, + }, + }, + Format: "", + Value: "0.1", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "url", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 83, + line: 7, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 119, + line: 7, + col: 45, + }, + }, + Format: "", + Value: "http://github.com/mitsuhiko/flask/", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "license", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 133, + line: 8, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 138, + line: 8, + col: 18, + }, + }, + Format: "", + Value: "BSD", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "author", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 151, + line: 9, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 167, + line: 9, + col: 28, + }, + }, + Format: "", + Value: "Armin Ronacher", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "author_email", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 186, + line: 10, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 215, + line: 10, + col: 47, + }, + }, + Format: "", + Value: "armin.ronacher@active-4.com", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "description", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 233, + line: 11, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 297, + line: 11, + col: 81, + }, + }, + Format: "", + Value: "A microframework based on Werkzeug, Jinja2 and good intentions", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "py_modules", + }, + value: { '@type': "List", + '@role': [Argument, Expression, List, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 314, + line: 12, + col: 16, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 315, + line: 12, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 322, + line: 12, + col: 24, + }, + }, + Format: "", + Value: "flask", + }, + ], + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "zip_safe", + }, + value: { '@type': "BoolLiteral", + '@token': "False", + '@role': [Argument, Boolean, Expression, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 338, + line: 13, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 343, + line: 13, + col: 19, + }, + }, + value: false, + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "platforms", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 359, + line: 14, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 364, + line: 14, + col: 20, + }, + }, + Format: "", + Value: "any", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "install_requires", + }, + value: { '@type': "List", + '@role': [Argument, Expression, List, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 387, + line: 15, + col: 22, + }, + }, + ctx: "Load", + elts: [], + }, + }, + ], + }, + }, + ], + 'noops_remainder': { '@type': "RemainderNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 389, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 463, + line: 18, + col: 1, + }, + }, + lines: [ + { '@type': "uast:Comment", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 389, + line: 16, + col: 1, + }, + }, + Block: false, + Prefix: "# ", + Suffix: "\n", + Tab: "", + Text: "disabled until release, install yourself", + }, + { '@type': "uast:Comment", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 441, + line: 17, + col: 1, + }, + }, + Block: false, + Prefix: " '", + Suffix: "\n", + Tab: "", + Text: "Werkzeug',", + }, + { '@type': "uast:Comment", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 463, + line: 18, + col: 1, + }, + }, + Block: false, + Prefix: " '", + Suffix: "\n", + Tab: "", + Text: "Jinja2'", + }, + ], + }, +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_44_dst.uast b/uast/diff/testdata/testcase_44_dst.uast new file mode 100644 index 00000000..7e8b9dab --- /dev/null +++ b/uast/diff/testdata/testcase_44_dst.uast @@ -0,0 +1,997 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 246, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 249, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask.globals\n ~~~~~~~~~~~~~\n\n Defines all the global objects that are proxies to the current\n active context.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 251, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 265, + line: 13, + col: 15, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "partial", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "functools", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 281, + line: 14, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 294, + line: 14, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "LocalStack", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "LocalProxy", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 330, + line: 16, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 344, + line: 16, + col: 19, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_lookup_object", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 356, + line: 17, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 356, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 359, + line: 17, + col: 8, + }, + }, + Name: "top", + }, + ], + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 363, + line: 17, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 381, + line: 17, + col: 30, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 362, + line: 17, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 380, + line: 17, + col: 29, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 362, + line: 17, + col: 11, + }, + }, + Name: "top", + }, + ], + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 389, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 391, + line: 18, + col: 7, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Raise", + '@token': "raise", + '@role': [Statement, Throw], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 413, + line: 19, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 418, + line: 19, + col: 14, + }, + }, + cause: ~, + exc: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 419, + line: 19, + col: 15, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 432, + line: 19, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 468, + line: 19, + col: 64, + }, + }, + Format: "", + Value: "working outside of request context", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 419, + line: 19, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 431, + line: 19, + col: 27, + }, + }, + Name: "RuntimeError", + }, + keywords: [], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 392, + line: 18, + col: 8, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 399, + line: 18, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 403, + line: 18, + col: 19, + }, + }, + LiteralValue: "None", + value: ~, + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 392, + line: 18, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 395, + line: 18, + col: 11, + }, + }, + Name: "top", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Is", + '@token': "is", + '@role': [Identical, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 474, + line: 20, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 480, + line: 20, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 481, + line: 20, + col: 12, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 489, + line: 20, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 492, + line: 20, + col: 23, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 494, + line: 20, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 498, + line: 20, + col: 29, + }, + }, + Name: "name", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 481, + line: 20, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 488, + line: 20, + col: 19, + }, + }, + Name: "getattr", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 345, + line: 16, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 349, + line: 16, + col: 24, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 345, + line: 16, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 349, + line: 16, + col: 24, + }, + }, + Name: "name", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 518, + line: 23, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 518, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 536, + line: 23, + col: 19, + }, + }, + Name: "_request_ctx_stack", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 539, + line: 23, + col: 22, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 539, + line: 23, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 549, + line: 23, + col: 32, + }, + }, + Name: "LocalStack", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 552, + line: 24, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 552, + line: 24, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 563, + line: 24, + col: 12, + }, + }, + Name: "current_app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 566, + line: 24, + col: 15, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 577, + line: 24, + col: 26, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 585, + line: 24, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 599, + line: 24, + col: 48, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 601, + line: 24, + col: 50, + }, + end: { '@type': "uast:Position", + offset: 606, + line: 24, + col: 55, + }, + }, + Format: "", + Value: "app", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 577, + line: 24, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 584, + line: 24, + col: 33, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 566, + line: 24, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 576, + line: 24, + col: 25, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 609, + line: 25, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 609, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 616, + line: 25, + col: 8, + }, + }, + Name: "request", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 619, + line: 25, + col: 11, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 630, + line: 25, + col: 22, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 638, + line: 25, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 652, + line: 25, + col: 44, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 654, + line: 25, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 663, + line: 25, + col: 55, + }, + }, + Format: "", + Value: "request", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 630, + line: 25, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 637, + line: 25, + col: 29, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 619, + line: 25, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 629, + line: 25, + col: 21, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 666, + line: 26, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 666, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 673, + line: 26, + col: 8, + }, + }, + Name: "session", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 676, + line: 26, + col: 11, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 687, + line: 26, + col: 22, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 695, + line: 26, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 709, + line: 26, + col: 44, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 711, + line: 26, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 720, + line: 26, + col: 55, + }, + }, + Format: "", + Value: "session", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 687, + line: 26, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 694, + line: 26, + col: 29, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 676, + line: 26, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 686, + line: 26, + col: 21, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 723, + line: 27, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 723, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 724, + line: 27, + col: 2, + }, + }, + Name: "g", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 727, + line: 27, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 738, + line: 27, + col: 16, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 746, + line: 27, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 760, + line: 27, + col: 38, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 762, + line: 27, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 765, + line: 27, + col: 43, + }, + }, + Format: "", + Value: "g", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 738, + line: 27, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 745, + line: 27, + col: 23, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 727, + line: 27, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 737, + line: 27, + col: 15, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_44_src.uast b/uast/diff/testdata/testcase_44_src.uast new file mode 100644 index 00000000..5f515f47 --- /dev/null +++ b/uast/diff/testdata/testcase_44_src.uast @@ -0,0 +1,682 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 246, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 249, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask.globals\n ~~~~~~~~~~~~~\n\n Defines all the global objects that are proxies to the current\n active context.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 251, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 264, + line: 13, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "LocalStack", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "LocalProxy", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 313, + line: 16, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 313, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 331, + line: 16, + col: 19, + }, + }, + Name: "_request_ctx_stack", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 334, + line: 16, + col: 22, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 334, + line: 16, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 344, + line: 16, + col: 32, + }, + }, + Name: "LocalStack", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 347, + line: 17, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 347, + line: 17, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 358, + line: 17, + col: 12, + }, + }, + Name: "current_app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 361, + line: 17, + col: 15, + }, + }, + args: [ + { '@type': "Lambda", + '@role': [Anonymous, Argument, Call, Declaration, Function, Name, Positional, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 372, + line: 17, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 378, + line: 17, + col: 32, + }, + }, + args: { '@type': "arguments", + '@role': [Argument, Declaration, Function, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + args: [], + }, + body: { '@type': "FunctionDef.body", + '@role': [Body, Declaration, Function], + 'body_stmts': { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 381, + line: 17, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 399, + line: 17, + col: 53, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 380, + line: 17, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 398, + line: 17, + col: 52, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 399, + line: 17, + col: 53, + }, + end: { '@type': "uast:Position", + offset: 402, + line: 17, + col: 56, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 380, + line: 17, + col: 34, + }, + }, + Name: "app", + }, + ], + }, + }, + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 361, + line: 17, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 371, + line: 17, + col: 25, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 408, + line: 18, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 408, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 415, + line: 18, + col: 8, + }, + }, + Name: "request", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 418, + line: 18, + col: 11, + }, + }, + args: [ + { '@type': "Lambda", + '@role': [Anonymous, Argument, Call, Declaration, Function, Name, Positional, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 429, + line: 18, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 435, + line: 18, + col: 28, + }, + }, + args: { '@type': "arguments", + '@role': [Argument, Declaration, Function, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + args: [], + }, + body: { '@type': "FunctionDef.body", + '@role': [Body, Declaration, Function], + 'body_stmts': { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 438, + line: 18, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 456, + line: 18, + col: 49, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 437, + line: 18, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 455, + line: 18, + col: 48, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 456, + line: 18, + col: 49, + }, + end: { '@type': "uast:Position", + offset: 459, + line: 18, + col: 52, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 437, + line: 18, + col: 30, + }, + }, + Name: "request", + }, + ], + }, + }, + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 418, + line: 18, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 428, + line: 18, + col: 21, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 469, + line: 19, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 469, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 476, + line: 19, + col: 8, + }, + }, + Name: "session", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 479, + line: 19, + col: 11, + }, + }, + args: [ + { '@type': "Lambda", + '@role': [Anonymous, Argument, Call, Declaration, Function, Name, Positional, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 490, + line: 19, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 496, + line: 19, + col: 28, + }, + }, + args: { '@type': "arguments", + '@role': [Argument, Declaration, Function, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + args: [], + }, + body: { '@type': "FunctionDef.body", + '@role': [Body, Declaration, Function], + 'body_stmts': { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 499, + line: 19, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 517, + line: 19, + col: 49, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 498, + line: 19, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 516, + line: 19, + col: 48, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 517, + line: 19, + col: 49, + }, + end: { '@type': "uast:Position", + offset: 520, + line: 19, + col: 52, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 498, + line: 19, + col: 30, + }, + }, + Name: "session", + }, + ], + }, + }, + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 479, + line: 19, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 489, + line: 19, + col: 21, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 530, + line: 20, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 530, + line: 20, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 531, + line: 20, + col: 2, + }, + }, + Name: "g", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 534, + line: 20, + col: 5, + }, + }, + args: [ + { '@type': "Lambda", + '@role': [Anonymous, Argument, Call, Declaration, Function, Name, Positional, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 545, + line: 20, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 551, + line: 20, + col: 22, + }, + }, + args: { '@type': "arguments", + '@role': [Argument, Declaration, Function, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + args: [], + }, + body: { '@type': "FunctionDef.body", + '@role': [Body, Declaration, Function], + 'body_stmts': { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 554, + line: 20, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 572, + line: 20, + col: 43, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 553, + line: 20, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 571, + line: 20, + col: 42, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 572, + line: 20, + col: 43, + }, + end: { '@type': "uast:Position", + offset: 575, + line: 20, + col: 46, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 553, + line: 20, + col: 24, + }, + }, + Name: "g", + }, + ], + }, + }, + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 534, + line: 20, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 544, + line: 20, + col: 15, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_45_dst.uast b/uast/diff/testdata/testcase_45_dst.uast new file mode 100644 index 00000000..20511785 --- /dev/null +++ b/uast/diff/testdata/testcase_45_dst.uast @@ -0,0 +1,315 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 15, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 387, + line: 15, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 411, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 422, + line: 16, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 18, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 474, + line: 19, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 673, + line: 22, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 752, + line: 23, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.module", + }, + Target: ~, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_45_src.uast b/uast/diff/testdata/testcase_45_src.uast new file mode 100644 index 00000000..5b44b142 --- /dev/null +++ b/uast/diff/testdata/testcase_45_src.uast @@ -0,0 +1,307 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 15, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 387, + line: 15, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 411, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 422, + line: 16, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 18, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 474, + line: 19, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 667, + line: 22, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 746, + line: 23, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.module", + }, + Target: ~, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_46_dst.uast b/uast/diff/testdata/testcase_46_dst.uast new file mode 100644 index 00000000..90977209 --- /dev/null +++ b/uast/diff/testdata/testcase_46_dst.uast @@ -0,0 +1,339 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 15, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 387, + line: 15, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 411, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 422, + line: 16, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 18, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 474, + line: 19, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 506, + line: 20, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 705, + line: 23, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 784, + line: 24, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.module", + }, + Target: ~, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_46_src.uast b/uast/diff/testdata/testcase_46_src.uast new file mode 100644 index 00000000..20511785 --- /dev/null +++ b/uast/diff/testdata/testcase_46_src.uast @@ -0,0 +1,315 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 15, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 387, + line: 15, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 411, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 422, + line: 16, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 18, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 474, + line: 19, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 673, + line: 22, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 752, + line: 23, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.module", + }, + Target: ~, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_47_dst.uast b/uast/diff/testdata/testcase_47_dst.uast new file mode 100644 index 00000000..68a328b4 --- /dev/null +++ b/uast/diff/testdata/testcase_47_dst.uast @@ -0,0 +1,497 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 220, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 223, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n flask.testsuite.deprecations\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n Tests deprecation support.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 225, + line: 12, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flask", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 224, + line: 11, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 224, + line: 11, + col: 1, + }, + }, + lines: [], + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 238, + line: 13, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "unittest", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 254, + line: 14, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "FlaskTestCase", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "catch_warnings", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.testsuite", + }, + Target: ~, + }, + { '@type': "ClassDef", + '@token': "DeprecationsTestCase", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 320, + line: 17, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 340, + line: 17, + col: 27, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 341, + line: 17, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 354, + line: 17, + col: 41, + }, + }, + Name: "FlaskTestCase", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 361, + line: 18, + col: 5, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 361, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 385, + line: 18, + col: 29, + }, + }, + Format: "", + Value: "not used currently", + }, + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 392, + line: 21, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 397, + line: 21, + col: 10, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "suite", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 405, + line: 22, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 405, + line: 22, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 410, + line: 22, + col: 10, + }, + }, + Name: "suite", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 413, + line: 22, + col: 13, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 414, + line: 22, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 422, + line: 22, + col: 22, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 413, + line: 22, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 421, + line: 22, + col: 21, + }, + }, + Name: "unittest", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 413, + line: 22, + col: 13, + }, + }, + Name: "TestSuite", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 438, + line: 23, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 438, + line: 23, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 452, + line: 23, + col: 19, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 471, + line: 23, + col: 38, + }, + end: { '@type': "uast:Position", + offset: 491, + line: 23, + col: 58, + }, + }, + Name: "DeprecationsTestCase", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 453, + line: 23, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 461, + line: 23, + col: 28, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 452, + line: 23, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 460, + line: 23, + col: 27, + }, + }, + Name: "unittest", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 452, + line: 23, + col: 19, + }, + }, + Name: "makeSuite", + }, + ], + }, + keywords: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 439, + line: 23, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 444, + line: 23, + col: 11, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 438, + line: 23, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 443, + line: 23, + col: 10, + }, + }, + Name: "suite", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 438, + line: 23, + col: 5, + }, + }, + Name: "addTest", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 498, + line: 24, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 504, + line: 24, + col: 11, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 505, + line: 24, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 510, + line: 24, + col: 17, + }, + }, + Name: "suite", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_47_src.uast b/uast/diff/testdata/testcase_47_src.uast new file mode 100644 index 00000000..2d1e7128 --- /dev/null +++ b/uast/diff/testdata/testcase_47_src.uast @@ -0,0 +1,1719 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 220, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 223, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n flask.testsuite.deprecations\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n Tests deprecation support.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 225, + line: 12, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 240, + line: 12, + col: 16, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "with_statement", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "__future__", + }, + Target: ~, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 264, + line: 14, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flask", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 263, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 263, + line: 13, + col: 1, + }, + }, + lines: [], + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 277, + line: 15, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "unittest", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 293, + line: 16, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "FlaskTestCase", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "catch_warnings", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.testsuite", + }, + Target: ~, + }, + { '@type': "ClassDef", + '@token': "DeprecationsTestCase", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 359, + line: 19, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 379, + line: 19, + col: 27, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 380, + line: 19, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 393, + line: 19, + col: 41, + }, + }, + Name: "FlaskTestCase", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 405, + line: 21, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 428, + line: 21, + col: 32, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "test_init_jinja_globals", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "ClassDef", + '@token': "MyFlask", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 450, + line: 22, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 457, + line: 22, + col: 22, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 459, + line: 22, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 464, + line: 22, + col: 29, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 458, + line: 22, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 463, + line: 22, + col: 28, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 458, + line: 22, + col: 23, + }, + }, + Name: "Flask", + }, + ], + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 488, + line: 23, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 506, + line: 23, + col: 35, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "init_jinja_globals", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 530, + line: 24, + col: 17, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 530, + line: 24, + col: 17, + }, + }, + ctx: "Store", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 553, + line: 24, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 558, + line: 24, + col: 45, + }, + }, + Format: "", + Value: "foo", + }, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 531, + line: 24, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 535, + line: 24, + col: 22, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 530, + line: 24, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 534, + line: 24, + col: 21, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 535, + line: 24, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 544, + line: 24, + col: 31, + }, + }, + Name: "jinja_env", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 530, + line: 24, + col: 17, + }, + }, + Name: "globals", + }, + ], + }, + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 562, + line: 24, + col: 49, + }, + end: { '@type': "uast:Position", + offset: 566, + line: 24, + col: 53, + }, + }, + Format: "", + Value: "42", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 507, + line: 23, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 511, + line: 23, + col: 40, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 507, + line: 23, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 511, + line: 23, + col: 40, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "With", + '@token': "with", + '@role': [Block, Scope, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 576, + line: 26, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 580, + line: 26, + col: 13, + }, + }, + body: { '@type': "With.body", + '@role': [Block, Body, Incomplete, Scope], + 'body_stmts': [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 618, + line: 27, + col: 13, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 618, + line: 27, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 621, + line: 27, + col: 16, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 624, + line: 27, + col: 19, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 632, + line: 27, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 640, + line: 27, + col: 35, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 624, + line: 27, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 631, + line: 27, + col: 26, + }, + }, + Name: "MyFlask", + }, + keywords: [], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 654, + line: 28, + col: 13, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "foo", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 709, + line: 30, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 715, + line: 30, + col: 23, + }, + }, + value: { '@type': "Subscript", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 716, + line: 30, + col: 24, + }, + }, + ctx: "Load", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 738, + line: 30, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 743, + line: 30, + col: 51, + }, + }, + Format: "", + Value: "foo", + }, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 717, + line: 30, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 720, + line: 30, + col: 28, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 716, + line: 30, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 719, + line: 30, + col: 27, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 720, + line: 30, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 729, + line: 30, + col: 37, + }, + }, + Name: "jinja_env", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 716, + line: 30, + col: 24, + }, + }, + Name: "globals", + }, + ], + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 758, + line: 32, + col: 13, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 758, + line: 32, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 759, + line: 32, + col: 14, + }, + }, + Name: "c", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 762, + line: 32, + col: 17, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 763, + line: 32, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 766, + line: 32, + col: 21, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 762, + line: 32, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 765, + line: 32, + col: 20, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 762, + line: 32, + col: 17, + }, + }, + Name: "test_client", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 792, + line: 33, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 792, + line: 33, + col: 13, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 811, + line: 33, + col: 32, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 810, + line: 33, + col: 31, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 816, + line: 33, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 819, + line: 33, + col: 40, + }, + }, + Format: "", + Value: "/", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 811, + line: 33, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 812, + line: 33, + col: 33, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 810, + line: 33, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 811, + line: 33, + col: 32, + }, + }, + Name: "c", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 810, + line: 33, + col: 31, + }, + }, + Name: "get", + }, + ], + }, + keywords: [], + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 810, + line: 33, + col: 31, + }, + }, + Name: "data", + }, + ], + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 827, + line: 33, + col: 48, + }, + end: { '@type': "uast:Position", + offset: 831, + line: 33, + col: 52, + }, + }, + Format: "", + Value: "42", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 793, + line: 33, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 797, + line: 33, + col: 18, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 792, + line: 33, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 796, + line: 33, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 792, + line: 33, + col: 13, + }, + }, + Name: "assert_equal", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 845, + line: 34, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 845, + line: 34, + col: 13, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 863, + line: 34, + col: 31, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 867, + line: 34, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 870, + line: 34, + col: 38, + }, + }, + Name: "log", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 863, + line: 34, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 866, + line: 34, + col: 34, + }, + }, + Name: "len", + }, + keywords: [], + }, + { '@type': "Num", + '@token': 1, + '@role': [Argument, Call, Expression, Function, Literal, Name, Number, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 873, + line: 34, + col: 41, + }, + end: { '@type': "uast:Position", + offset: 874, + line: 34, + col: 42, + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 846, + line: 34, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 850, + line: 34, + col: 18, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 845, + line: 34, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 849, + line: 34, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 845, + line: 34, + col: 13, + }, + }, + Name: "assert_equal", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 35, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 35, + col: 13, + }, + }, + args: [ + { '@type': "Compare", + '@role': [Argument, Binary, Call, Condition, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 901, + line: 35, + col: 26, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 925, + line: 35, + col: 50, + }, + }, + args: [ + { '@type': "Subscript", + '@role': [Argument, Call, Expression, Function, Incomplete, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 929, + line: 35, + col: 54, + }, + }, + ctx: "Load", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 936, + line: 35, + col: 61, + }, + end: { '@type': "uast:Position", + offset: 945, + line: 35, + col: 70, + }, + }, + Format: "", + Value: "message", + }, + }, + value: { '@type': "Subscript", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 929, + line: 35, + col: 54, + }, + }, + ctx: "Load", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "Num", + '@token': 0, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 933, + line: 35, + col: 58, + }, + end: { '@type': "uast:Position", + offset: 934, + line: 35, + col: 59, + }, + }, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 929, + line: 35, + col: 54, + }, + end: { '@type': "uast:Position", + offset: 932, + line: 35, + col: 57, + }, + }, + Name: "log", + }, + }, + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 925, + line: 35, + col: 50, + }, + end: { '@type': "uast:Position", + offset: 928, + line: 35, + col: 53, + }, + }, + Name: "str", + }, + keywords: [], + }, + ], + }, + left: { '@type': "uast:String", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 901, + line: 35, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 921, + line: 35, + col: 46, + }, + }, + Format: "", + Value: "init_jinja_globals", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "In", + '@token': "in", + '@role': [Contains, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 889, + line: 35, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 893, + line: 35, + col: 18, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 35, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 892, + line: 35, + col: 17, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 35, + col: 13, + }, + }, + Name: "assert_", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + items: { '@type': "With.items", + '@role': [Block, Incomplete, Scope], + items: [ + { '@type': "withitem", + '@role': [Expression, Identifier, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + 'context_expr': { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 581, + line: 26, + col: 14, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 581, + line: 26, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 595, + line: 26, + col: 28, + }, + }, + Name: "catch_warnings", + }, + keywords: [], + }, + 'optional_vars': { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 601, + line: 26, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 604, + line: 26, + col: 37, + }, + }, + Name: "log", + }, + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 429, + line: 21, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 433, + line: 21, + col: 37, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 429, + line: 21, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 433, + line: 21, + col: 37, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 955, + line: 38, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 960, + line: 38, + col: 10, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "suite", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 968, + line: 39, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 968, + line: 39, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 973, + line: 39, + col: 10, + }, + }, + Name: "suite", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 976, + line: 39, + col: 13, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 977, + line: 39, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 985, + line: 39, + col: 22, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 976, + line: 39, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 984, + line: 39, + col: 21, + }, + }, + Name: "unittest", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 976, + line: 39, + col: 13, + }, + }, + Name: "TestSuite", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1001, + line: 40, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1001, + line: 40, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1015, + line: 40, + col: 19, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1034, + line: 40, + col: 38, + }, + end: { '@type': "uast:Position", + offset: 1054, + line: 40, + col: 58, + }, + }, + Name: "DeprecationsTestCase", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1016, + line: 40, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 1024, + line: 40, + col: 28, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1015, + line: 40, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 1023, + line: 40, + col: 27, + }, + }, + Name: "unittest", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1015, + line: 40, + col: 19, + }, + }, + Name: "makeSuite", + }, + ], + }, + keywords: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1002, + line: 40, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 1007, + line: 40, + col: 11, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1001, + line: 40, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1006, + line: 40, + col: 10, + }, + }, + Name: "suite", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1001, + line: 40, + col: 5, + }, + }, + Name: "addTest", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1061, + line: 41, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1067, + line: 41, + col: 11, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1068, + line: 41, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 1073, + line: 41, + col: 17, + }, + }, + Name: "suite", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_48_dst.uast b/uast/diff/testdata/testcase_48_dst.uast new file mode 100644 index 00000000..84fadeb4 --- /dev/null +++ b/uast/diff/testdata/testcase_48_dst.uast @@ -0,0 +1,497 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 220, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 223, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n flask.testsuite.deprecations\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n Tests deprecation support.\n\n :copyright: (c) 2014 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 225, + line: 12, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flask", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 224, + line: 11, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 224, + line: 11, + col: 1, + }, + }, + lines: [], + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 238, + line: 13, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "unittest", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 254, + line: 14, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "FlaskTestCase", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "catch_warnings", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.testsuite", + }, + Target: ~, + }, + { '@type': "ClassDef", + '@token': "DeprecationsTestCase", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 320, + line: 17, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 340, + line: 17, + col: 27, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 341, + line: 17, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 354, + line: 17, + col: 41, + }, + }, + Name: "FlaskTestCase", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 361, + line: 18, + col: 5, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 361, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 385, + line: 18, + col: 29, + }, + }, + Format: "", + Value: "not used currently", + }, + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 392, + line: 21, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 397, + line: 21, + col: 10, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "suite", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 405, + line: 22, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 405, + line: 22, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 410, + line: 22, + col: 10, + }, + }, + Name: "suite", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 413, + line: 22, + col: 13, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 414, + line: 22, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 422, + line: 22, + col: 22, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 413, + line: 22, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 421, + line: 22, + col: 21, + }, + }, + Name: "unittest", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 413, + line: 22, + col: 13, + }, + }, + Name: "TestSuite", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 438, + line: 23, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 438, + line: 23, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 452, + line: 23, + col: 19, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 471, + line: 23, + col: 38, + }, + end: { '@type': "uast:Position", + offset: 491, + line: 23, + col: 58, + }, + }, + Name: "DeprecationsTestCase", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 453, + line: 23, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 461, + line: 23, + col: 28, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 452, + line: 23, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 460, + line: 23, + col: 27, + }, + }, + Name: "unittest", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 452, + line: 23, + col: 19, + }, + }, + Name: "makeSuite", + }, + ], + }, + keywords: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 439, + line: 23, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 444, + line: 23, + col: 11, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 438, + line: 23, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 443, + line: 23, + col: 10, + }, + }, + Name: "suite", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 438, + line: 23, + col: 5, + }, + }, + Name: "addTest", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 498, + line: 24, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 504, + line: 24, + col: 11, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 505, + line: 24, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 510, + line: 24, + col: 17, + }, + }, + Name: "suite", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_48_src.uast b/uast/diff/testdata/testcase_48_src.uast new file mode 100644 index 00000000..68a328b4 --- /dev/null +++ b/uast/diff/testdata/testcase_48_src.uast @@ -0,0 +1,497 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 220, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 223, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n flask.testsuite.deprecations\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n Tests deprecation support.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 225, + line: 12, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flask", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 224, + line: 11, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 224, + line: 11, + col: 1, + }, + }, + lines: [], + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 238, + line: 13, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "unittest", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 254, + line: 14, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "FlaskTestCase", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "catch_warnings", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.testsuite", + }, + Target: ~, + }, + { '@type': "ClassDef", + '@token': "DeprecationsTestCase", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 320, + line: 17, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 340, + line: 17, + col: 27, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 341, + line: 17, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 354, + line: 17, + col: 41, + }, + }, + Name: "FlaskTestCase", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 361, + line: 18, + col: 5, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 361, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 385, + line: 18, + col: 29, + }, + }, + Format: "", + Value: "not used currently", + }, + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 392, + line: 21, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 397, + line: 21, + col: 10, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "suite", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 405, + line: 22, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 405, + line: 22, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 410, + line: 22, + col: 10, + }, + }, + Name: "suite", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 413, + line: 22, + col: 13, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 414, + line: 22, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 422, + line: 22, + col: 22, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 413, + line: 22, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 421, + line: 22, + col: 21, + }, + }, + Name: "unittest", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 413, + line: 22, + col: 13, + }, + }, + Name: "TestSuite", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 438, + line: 23, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 438, + line: 23, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 452, + line: 23, + col: 19, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 471, + line: 23, + col: 38, + }, + end: { '@type': "uast:Position", + offset: 491, + line: 23, + col: 58, + }, + }, + Name: "DeprecationsTestCase", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 453, + line: 23, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 461, + line: 23, + col: 28, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 452, + line: 23, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 460, + line: 23, + col: 27, + }, + }, + Name: "unittest", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 452, + line: 23, + col: 19, + }, + }, + Name: "makeSuite", + }, + ], + }, + keywords: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 439, + line: 23, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 444, + line: 23, + col: 11, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 438, + line: 23, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 443, + line: 23, + col: 10, + }, + }, + Name: "suite", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 438, + line: 23, + col: 5, + }, + }, + Name: "addTest", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 498, + line: 24, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 504, + line: 24, + col: 11, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 505, + line: 24, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 510, + line: 24, + col: 17, + }, + }, + Name: "suite", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_49_dst.uast b/uast/diff/testdata/testcase_49_dst.uast new file mode 100644 index 00000000..90977209 --- /dev/null +++ b/uast/diff/testdata/testcase_49_dst.uast @@ -0,0 +1,339 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 15, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 387, + line: 15, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 411, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 422, + line: 16, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 18, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 474, + line: 19, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 506, + line: 20, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 705, + line: 23, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 784, + line: 24, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.module", + }, + Target: ~, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_49_src.uast b/uast/diff/testdata/testcase_49_src.uast new file mode 100644 index 00000000..20511785 --- /dev/null +++ b/uast/diff/testdata/testcase_49_src.uast @@ -0,0 +1,315 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 15, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 387, + line: 15, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 411, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 422, + line: 16, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 18, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 474, + line: 19, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 673, + line: 22, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 752, + line: 23, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.module", + }, + Target: ~, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_4_dst.uast b/uast/diff/testdata/testcase_4_dst.uast new file mode 100644 index 00000000..99e9c673 --- /dev/null +++ b/uast/diff/testdata/testcase_4_dst.uast @@ -0,0 +1,317 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "unittest", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 16, + line: 2, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "BetterLoader", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.testsuite", + }, + Target: ~, + }, + { '@type': "TryExcept", + '@role': [Catch, Statement, Try], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 3, + col: 1, + }, + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 66, + line: 4, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 66, + line: 4, + col: 5, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 67, + line: 4, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 75, + line: 4, + col: 14, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 66, + line: 4, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 74, + line: 4, + col: 13, + }, + }, + Name: "unittest", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 66, + line: 4, + col: 5, + }, + }, + Name: "main", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "testLoader", + }, + value: { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 91, + line: 4, + col: 30, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 91, + line: 4, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 103, + line: 4, + col: 42, + }, + }, + Name: "BetterLoader", + }, + keywords: [], + kwargs: ~, + starargs: ~, + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "defaultTest", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 119, + line: 4, + col: 58, + }, + end: { '@type': "uast:Position", + offset: 126, + line: 4, + col: 65, + }, + }, + Format: "", + Value: "suite", + }, + }, + ], + kwargs: ~, + starargs: ~, + }, + }, + ], + handlers: [ + { '@type': "ExceptHandler", + '@role': [Catch, Identifier, Try], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 128, + line: 5, + col: 1, + }, + }, + '@token': { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 146, + line: 5, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 147, + line: 5, + col: 20, + }, + }, + Name: "e", + }, + body: [ + { '@type': "Print", + '@token': "print", + '@role': [Call, Callee, Expression, Function, Identifier], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 153, + line: 6, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 158, + line: 6, + col: 10, + }, + }, + dest: ~, + nl: true, + values: [ + { '@type': "BinOp", + '@role': [Argument, Binary, Call, Expression, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 159, + line: 6, + col: 11, + }, + }, + left: { '@type': "uast:String", + '@role': [Binary, Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 159, + line: 6, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 170, + line: 6, + col: 22, + }, + }, + Format: "", + Value: "Error: %s", + }, + op: { '@type': "Mod", + '@token': "%", + '@role': [Arithmetic, Binary, Module, Operator], + '@pos': { '@type': "uast:Positions", + }, + }, + right: { '@type': "uast:Identifier", + '@role': [Binary, Expression, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 173, + line: 6, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 174, + line: 6, + col: 26, + }, + }, + Name: "e", + }, + }, + ], + }, + ], + type: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 135, + line: 5, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 144, + line: 5, + col: 17, + }, + }, + Name: "Exception", + }, + }, + ], + orelse: [], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_4_src.uast b/uast/diff/testdata/testcase_4_src.uast new file mode 100644 index 00000000..5e167c2e --- /dev/null +++ b/uast/diff/testdata/testcase_4_src.uast @@ -0,0 +1,187 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "unittest", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 16, + line: 2, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "BetterLoader", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.testsuite", + }, + Target: ~, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 3, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 3, + col: 1, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 58, + line: 3, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 66, + line: 3, + col: 10, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 3, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 65, + line: 3, + col: 9, + }, + }, + Name: "unittest", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 3, + col: 1, + }, + }, + Name: "main", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "testLoader", + }, + value: { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 82, + line: 3, + col: 26, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 82, + line: 3, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 94, + line: 3, + col: 38, + }, + }, + Name: "BetterLoader", + }, + keywords: [], + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "defaultTest", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 110, + line: 3, + col: 54, + }, + end: { '@type': "uast:Position", + offset: 117, + line: 3, + col: 61, + }, + }, + Format: "", + Value: "suite", + }, + }, + ], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_50_dst.uast b/uast/diff/testdata/testcase_50_dst.uast new file mode 100644 index 00000000..bff36d11 --- /dev/null +++ b/uast/diff/testdata/testcase_50_dst.uast @@ -0,0 +1,355 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 15, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 387, + line: 15, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 411, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 422, + line: 16, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 18, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 493, + line: 19, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 525, + line: 20, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 724, + line: 23, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 803, + line: 24, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.module", + }, + Target: ~, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_50_src.uast b/uast/diff/testdata/testcase_50_src.uast new file mode 100644 index 00000000..90977209 --- /dev/null +++ b/uast/diff/testdata/testcase_50_src.uast @@ -0,0 +1,339 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 15, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 387, + line: 15, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 411, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 422, + line: 16, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 18, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 474, + line: 19, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 506, + line: 20, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 705, + line: 23, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 784, + line: 24, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.module", + }, + Target: ~, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_51_dst.uast b/uast/diff/testdata/testcase_51_dst.uast new file mode 100644 index 00000000..28866856 --- /dev/null +++ b/uast/diff/testdata/testcase_51_dst.uast @@ -0,0 +1,363 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 15, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 387, + line: 15, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 411, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 422, + line: 16, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 18, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 493, + line: 19, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 525, + line: 20, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 660, + line: 22, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 739, + line: 23, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 771, + line: 24, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.templating", + }, + Target: ~, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_51_src.uast b/uast/diff/testdata/testcase_51_src.uast new file mode 100644 index 00000000..bff36d11 --- /dev/null +++ b/uast/diff/testdata/testcase_51_src.uast @@ -0,0 +1,355 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 15, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 387, + line: 15, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 411, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 422, + line: 16, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 18, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 493, + line: 19, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 525, + line: 20, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 724, + line: 23, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 803, + line: 24, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.module", + }, + Target: ~, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_52_dst.uast b/uast/diff/testdata/testcase_52_dst.uast new file mode 100644 index 00000000..09c48468 --- /dev/null +++ b/uast/diff/testdata/testcase_52_dst.uast @@ -0,0 +1,421 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 15, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 387, + line: 15, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 411, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 422, + line: 16, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 18, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 493, + line: 19, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 525, + line: 20, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 654, + line: 22, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 733, + line: 23, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 765, + line: 24, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.templating", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 872, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 874, + line: 27, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 895, + line: 28, + col: 5, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 875, + line: 27, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 889, + line: 27, + col: 18, + }, + }, + Name: "json_available", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_52_src.uast b/uast/diff/testdata/testcase_52_src.uast new file mode 100644 index 00000000..28866856 --- /dev/null +++ b/uast/diff/testdata/testcase_52_src.uast @@ -0,0 +1,363 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 15, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 387, + line: 15, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 411, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 422, + line: 16, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 18, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 493, + line: 19, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 525, + line: 20, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 660, + line: 22, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 739, + line: 23, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 771, + line: 24, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.templating", + }, + Target: ~, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_53_dst.uast b/uast/diff/testdata/testcase_53_dst.uast new file mode 100644 index 00000000..f89f5921 --- /dev/null +++ b/uast/diff/testdata/testcase_53_dst.uast @@ -0,0 +1,720 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 229, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 232, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n jQuery Example\n ~~~~~~~~~~~~~~\n\n A simple application that shows how Flask and jQuery get along.\n\n :copyright: (c) 2014 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 233, + line: 11, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 243, + line: 11, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 292, + line: 12, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 292, + line: 12, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 295, + line: 12, + col: 4, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 298, + line: 12, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 304, + line: 12, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 312, + line: 12, + col: 21, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 298, + line: 12, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 303, + line: 12, + col: 12, + }, + }, + Name: "Flask", + }, + keywords: [], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 316, + line: 15, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "add_numbers", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 367, + line: 17, + col: 5, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 367, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 424, + line: 17, + col: 62, + }, + }, + Format: "", + Value: "Add two numbers server side, ridiculous but well...", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 429, + line: 18, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 429, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 430, + line: 18, + col: 6, + }, + }, + Name: "a", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 433, + line: 18, + col: 9, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 450, + line: 18, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 453, + line: 18, + col: 29, + }, + }, + Format: "", + Value: "a", + }, + { '@type': "Num", + '@token': 0, + '@role': [Argument, Call, Expression, Function, Literal, Name, Number, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 455, + line: 18, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 456, + line: 18, + col: 32, + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 434, + line: 18, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 441, + line: 18, + col: 17, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 433, + line: 18, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 440, + line: 18, + col: 16, + }, + }, + Name: "request", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 441, + line: 18, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 445, + line: 18, + col: 21, + }, + }, + Name: "args", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 433, + line: 18, + col: 9, + }, + }, + Name: "get", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "type", + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 463, + line: 18, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 466, + line: 18, + col: 42, + }, + }, + Name: "int", + }, + }, + ], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 472, + line: 19, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 472, + line: 19, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 473, + line: 19, + col: 6, + }, + }, + Name: "b", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 476, + line: 19, + col: 9, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 493, + line: 19, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 496, + line: 19, + col: 29, + }, + }, + Format: "", + Value: "b", + }, + { '@type': "Num", + '@token': 0, + '@role': [Argument, Call, Expression, Function, Literal, Name, Number, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 498, + line: 19, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 499, + line: 19, + col: 32, + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 477, + line: 19, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 484, + line: 19, + col: 17, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 476, + line: 19, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 483, + line: 19, + col: 16, + }, + }, + Name: "request", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 484, + line: 19, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 488, + line: 19, + col: 21, + }, + }, + Name: "args", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 476, + line: 19, + col: 9, + }, + }, + Name: "get", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "type", + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 506, + line: 19, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 509, + line: 19, + col: 42, + }, + }, + Name: "int", + }, + }, + ], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 515, + line: 20, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 521, + line: 20, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 522, + line: 20, + col: 12, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 522, + line: 20, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 529, + line: 20, + col: 19, + }, + }, + Name: "jsonify", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "result", + }, + value: { '@type': "BinOp", + '@role': [Argument, Binary, Expression, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 537, + line: 20, + col: 27, + }, + }, + left: { '@type': "uast:Identifier", + '@role': [Binary, Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 537, + line: 20, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 538, + line: 20, + col: 28, + }, + }, + Name: "a", + }, + op: { '@type': "Add", + '@token': "+", + '@role': [Add, Arithmetic, Binary, Operator], + '@pos': { '@type': "uast:Positions", + }, + }, + right: { '@type': "uast:Identifier", + '@role': [Binary, Expression, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 541, + line: 20, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 542, + line: 20, + col: 32, + }, + }, + Name: "b", + }, + }, + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 546, + line: 23, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 579, + line: 25, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 585, + line: 25, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 586, + line: 25, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 602, + line: 25, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 614, + line: 25, + col: 40, + }, + }, + Format: "", + Value: "index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 586, + line: 25, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 601, + line: 25, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_53_src.uast b/uast/diff/testdata/testcase_53_src.uast new file mode 100644 index 00000000..39658041 --- /dev/null +++ b/uast/diff/testdata/testcase_53_src.uast @@ -0,0 +1,869 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 229, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 232, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n jQuery Example\n ~~~~~~~~~~~~~~\n\n A simple application that shows how Flask and jQuery get along.\n\n :copyright: (c) 2014 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 233, + line: 11, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 243, + line: 11, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 292, + line: 12, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 292, + line: 12, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 295, + line: 12, + col: 4, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 298, + line: 12, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 304, + line: 12, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 312, + line: 12, + col: 21, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 298, + line: 12, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 303, + line: 12, + col: 12, + }, + }, + Name: "Flask", + }, + keywords: [], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 316, + line: 15, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "add_numbers", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 367, + line: 17, + col: 5, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 367, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 424, + line: 17, + col: 62, + }, + }, + Format: "", + Value: "Add two numbers server side, ridiculous but well...", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 429, + line: 18, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 429, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 430, + line: 18, + col: 6, + }, + }, + Name: "a", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 433, + line: 18, + col: 9, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 450, + line: 18, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 453, + line: 18, + col: 29, + }, + }, + Format: "", + Value: "a", + }, + { '@type': "Num", + '@token': 0, + '@role': [Argument, Call, Expression, Function, Literal, Name, Number, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 455, + line: 18, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 456, + line: 18, + col: 32, + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 434, + line: 18, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 441, + line: 18, + col: 17, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 433, + line: 18, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 440, + line: 18, + col: 16, + }, + }, + Name: "request", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 441, + line: 18, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 445, + line: 18, + col: 21, + }, + }, + Name: "args", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 433, + line: 18, + col: 9, + }, + }, + Name: "get", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "type", + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 463, + line: 18, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 466, + line: 18, + col: 42, + }, + }, + Name: "int", + }, + }, + ], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 472, + line: 19, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 472, + line: 19, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 473, + line: 19, + col: 6, + }, + }, + Name: "b", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 476, + line: 19, + col: 9, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 493, + line: 19, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 496, + line: 19, + col: 29, + }, + }, + Format: "", + Value: "b", + }, + { '@type': "Num", + '@token': 0, + '@role': [Argument, Call, Expression, Function, Literal, Name, Number, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 498, + line: 19, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 499, + line: 19, + col: 32, + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 477, + line: 19, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 484, + line: 19, + col: 17, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 476, + line: 19, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 483, + line: 19, + col: 16, + }, + }, + Name: "request", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 484, + line: 19, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 488, + line: 19, + col: 21, + }, + }, + Name: "args", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 476, + line: 19, + col: 9, + }, + }, + Name: "get", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "type", + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 506, + line: 19, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 509, + line: 19, + col: 42, + }, + }, + Name: "int", + }, + }, + ], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 515, + line: 20, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 521, + line: 20, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 522, + line: 20, + col: 12, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 522, + line: 20, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 529, + line: 20, + col: 19, + }, + }, + Name: "jsonify", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "result", + }, + value: { '@type': "BinOp", + '@role': [Argument, Binary, Expression, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 537, + line: 20, + col: 27, + }, + }, + left: { '@type': "uast:Identifier", + '@role': [Binary, Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 537, + line: 20, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 538, + line: 20, + col: 28, + }, + }, + Name: "a", + }, + op: { '@type': "Add", + '@token': "+", + '@role': [Add, Arithmetic, Binary, Operator], + '@pos': { '@type': "uast:Positions", + }, + }, + right: { '@type': "uast:Identifier", + '@role': [Binary, Expression, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 541, + line: 20, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 542, + line: 20, + col: 32, + }, + }, + Name: "b", + }, + }, + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 546, + line: 23, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 579, + line: 25, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 585, + line: 25, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 586, + line: 25, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 602, + line: 25, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 614, + line: 25, + col: 40, + }, + }, + Format: "", + Value: "index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 586, + line: 25, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 601, + line: 25, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 618, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 620, + line: 28, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 649, + line: 29, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 649, + line: 29, + col: 5, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 650, + line: 29, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 653, + line: 29, + col: 9, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 649, + line: 29, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 652, + line: 29, + col: 8, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 649, + line: 29, + col: 5, + }, + }, + Name: "run", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 621, + line: 28, + col: 4, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 633, + line: 28, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 643, + line: 28, + col: 26, + }, + }, + Format: "", + Value: "__main__", + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 621, + line: 28, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 629, + line: 28, + col: 12, + }, + }, + Name: "__name__", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_54_dst.uast b/uast/diff/testdata/testcase_54_dst.uast new file mode 100644 index 00000000..da853933 --- /dev/null +++ b/uast/diff/testdata/testcase_54_dst.uast @@ -0,0 +1,720 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 229, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 232, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n jQuery Example\n ~~~~~~~~~~~~~~\n\n A simple application that shows how Flask and jQuery get along.\n\n :copyright: (c) 2015 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 233, + line: 11, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 243, + line: 11, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 292, + line: 12, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 292, + line: 12, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 295, + line: 12, + col: 4, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 298, + line: 12, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 304, + line: 12, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 312, + line: 12, + col: 21, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 298, + line: 12, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 303, + line: 12, + col: 12, + }, + }, + Name: "Flask", + }, + keywords: [], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 316, + line: 15, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "add_numbers", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 367, + line: 17, + col: 5, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 367, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 424, + line: 17, + col: 62, + }, + }, + Format: "", + Value: "Add two numbers server side, ridiculous but well...", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 429, + line: 18, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 429, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 430, + line: 18, + col: 6, + }, + }, + Name: "a", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 433, + line: 18, + col: 9, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 450, + line: 18, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 453, + line: 18, + col: 29, + }, + }, + Format: "", + Value: "a", + }, + { '@type': "Num", + '@token': 0, + '@role': [Argument, Call, Expression, Function, Literal, Name, Number, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 455, + line: 18, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 456, + line: 18, + col: 32, + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 434, + line: 18, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 441, + line: 18, + col: 17, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 433, + line: 18, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 440, + line: 18, + col: 16, + }, + }, + Name: "request", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 441, + line: 18, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 445, + line: 18, + col: 21, + }, + }, + Name: "args", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 433, + line: 18, + col: 9, + }, + }, + Name: "get", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "type", + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 463, + line: 18, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 466, + line: 18, + col: 42, + }, + }, + Name: "int", + }, + }, + ], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 472, + line: 19, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 472, + line: 19, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 473, + line: 19, + col: 6, + }, + }, + Name: "b", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 476, + line: 19, + col: 9, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 493, + line: 19, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 496, + line: 19, + col: 29, + }, + }, + Format: "", + Value: "b", + }, + { '@type': "Num", + '@token': 0, + '@role': [Argument, Call, Expression, Function, Literal, Name, Number, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 498, + line: 19, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 499, + line: 19, + col: 32, + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 477, + line: 19, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 484, + line: 19, + col: 17, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 476, + line: 19, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 483, + line: 19, + col: 16, + }, + }, + Name: "request", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 484, + line: 19, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 488, + line: 19, + col: 21, + }, + }, + Name: "args", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 476, + line: 19, + col: 9, + }, + }, + Name: "get", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "type", + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 506, + line: 19, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 509, + line: 19, + col: 42, + }, + }, + Name: "int", + }, + }, + ], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 515, + line: 20, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 521, + line: 20, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 522, + line: 20, + col: 12, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 522, + line: 20, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 529, + line: 20, + col: 19, + }, + }, + Name: "jsonify", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "result", + }, + value: { '@type': "BinOp", + '@role': [Argument, Binary, Expression, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 537, + line: 20, + col: 27, + }, + }, + left: { '@type': "uast:Identifier", + '@role': [Binary, Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 537, + line: 20, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 538, + line: 20, + col: 28, + }, + }, + Name: "a", + }, + op: { '@type': "Add", + '@token': "+", + '@role': [Add, Arithmetic, Binary, Operator], + '@pos': { '@type': "uast:Positions", + }, + }, + right: { '@type': "uast:Identifier", + '@role': [Binary, Expression, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 541, + line: 20, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 542, + line: 20, + col: 32, + }, + }, + Name: "b", + }, + }, + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 546, + line: 23, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 579, + line: 25, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 585, + line: 25, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 586, + line: 25, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 602, + line: 25, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 614, + line: 25, + col: 40, + }, + }, + Format: "", + Value: "index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 586, + line: 25, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 601, + line: 25, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_54_src.uast b/uast/diff/testdata/testcase_54_src.uast new file mode 100644 index 00000000..f89f5921 --- /dev/null +++ b/uast/diff/testdata/testcase_54_src.uast @@ -0,0 +1,720 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 229, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 232, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n jQuery Example\n ~~~~~~~~~~~~~~\n\n A simple application that shows how Flask and jQuery get along.\n\n :copyright: (c) 2014 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 233, + line: 11, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 243, + line: 11, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 292, + line: 12, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 292, + line: 12, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 295, + line: 12, + col: 4, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 298, + line: 12, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 304, + line: 12, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 312, + line: 12, + col: 21, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 298, + line: 12, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 303, + line: 12, + col: 12, + }, + }, + Name: "Flask", + }, + keywords: [], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 316, + line: 15, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "add_numbers", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 367, + line: 17, + col: 5, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 367, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 424, + line: 17, + col: 62, + }, + }, + Format: "", + Value: "Add two numbers server side, ridiculous but well...", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 429, + line: 18, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 429, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 430, + line: 18, + col: 6, + }, + }, + Name: "a", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 433, + line: 18, + col: 9, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 450, + line: 18, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 453, + line: 18, + col: 29, + }, + }, + Format: "", + Value: "a", + }, + { '@type': "Num", + '@token': 0, + '@role': [Argument, Call, Expression, Function, Literal, Name, Number, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 455, + line: 18, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 456, + line: 18, + col: 32, + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 434, + line: 18, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 441, + line: 18, + col: 17, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 433, + line: 18, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 440, + line: 18, + col: 16, + }, + }, + Name: "request", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 441, + line: 18, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 445, + line: 18, + col: 21, + }, + }, + Name: "args", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 433, + line: 18, + col: 9, + }, + }, + Name: "get", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "type", + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 463, + line: 18, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 466, + line: 18, + col: 42, + }, + }, + Name: "int", + }, + }, + ], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 472, + line: 19, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 472, + line: 19, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 473, + line: 19, + col: 6, + }, + }, + Name: "b", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 476, + line: 19, + col: 9, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 493, + line: 19, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 496, + line: 19, + col: 29, + }, + }, + Format: "", + Value: "b", + }, + { '@type': "Num", + '@token': 0, + '@role': [Argument, Call, Expression, Function, Literal, Name, Number, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 498, + line: 19, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 499, + line: 19, + col: 32, + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 477, + line: 19, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 484, + line: 19, + col: 17, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 476, + line: 19, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 483, + line: 19, + col: 16, + }, + }, + Name: "request", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 484, + line: 19, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 488, + line: 19, + col: 21, + }, + }, + Name: "args", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 476, + line: 19, + col: 9, + }, + }, + Name: "get", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "type", + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 506, + line: 19, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 509, + line: 19, + col: 42, + }, + }, + Name: "int", + }, + }, + ], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 515, + line: 20, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 521, + line: 20, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 522, + line: 20, + col: 12, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 522, + line: 20, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 529, + line: 20, + col: 19, + }, + }, + Name: "jsonify", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "result", + }, + value: { '@type': "BinOp", + '@role': [Argument, Binary, Expression, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 537, + line: 20, + col: 27, + }, + }, + left: { '@type': "uast:Identifier", + '@role': [Binary, Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 537, + line: 20, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 538, + line: 20, + col: 28, + }, + }, + Name: "a", + }, + op: { '@type': "Add", + '@token': "+", + '@role': [Add, Arithmetic, Binary, Operator], + '@pos': { '@type': "uast:Positions", + }, + }, + right: { '@type': "uast:Identifier", + '@role': [Binary, Expression, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 541, + line: 20, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 542, + line: 20, + col: 32, + }, + }, + Name: "b", + }, + }, + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 546, + line: 23, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 579, + line: 25, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 585, + line: 25, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 586, + line: 25, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 602, + line: 25, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 614, + line: 25, + col: 40, + }, + }, + Format: "", + Value: "index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 586, + line: 25, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 601, + line: 25, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_55_dst.uast b/uast/diff/testdata/testcase_55_dst.uast new file mode 100644 index 00000000..789f7077 --- /dev/null +++ b/uast/diff/testdata/testcase_55_dst.uast @@ -0,0 +1,869 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 229, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 232, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n jQuery Example\n ~~~~~~~~~~~~~~\n\n A simple application that shows how Flask and jQuery get along.\n\n :copyright: (c) 2015 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 233, + line: 11, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 243, + line: 11, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 292, + line: 12, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 292, + line: 12, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 295, + line: 12, + col: 4, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 298, + line: 12, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 304, + line: 12, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 312, + line: 12, + col: 21, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 298, + line: 12, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 303, + line: 12, + col: 12, + }, + }, + Name: "Flask", + }, + keywords: [], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 316, + line: 15, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "add_numbers", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 367, + line: 17, + col: 5, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 367, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 424, + line: 17, + col: 62, + }, + }, + Format: "", + Value: "Add two numbers server side, ridiculous but well...", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 429, + line: 18, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 429, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 430, + line: 18, + col: 6, + }, + }, + Name: "a", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 433, + line: 18, + col: 9, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 450, + line: 18, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 453, + line: 18, + col: 29, + }, + }, + Format: "", + Value: "a", + }, + { '@type': "Num", + '@token': 0, + '@role': [Argument, Call, Expression, Function, Literal, Name, Number, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 455, + line: 18, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 456, + line: 18, + col: 32, + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 434, + line: 18, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 441, + line: 18, + col: 17, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 433, + line: 18, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 440, + line: 18, + col: 16, + }, + }, + Name: "request", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 441, + line: 18, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 445, + line: 18, + col: 21, + }, + }, + Name: "args", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 433, + line: 18, + col: 9, + }, + }, + Name: "get", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "type", + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 463, + line: 18, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 466, + line: 18, + col: 42, + }, + }, + Name: "int", + }, + }, + ], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 472, + line: 19, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 472, + line: 19, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 473, + line: 19, + col: 6, + }, + }, + Name: "b", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 476, + line: 19, + col: 9, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 493, + line: 19, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 496, + line: 19, + col: 29, + }, + }, + Format: "", + Value: "b", + }, + { '@type': "Num", + '@token': 0, + '@role': [Argument, Call, Expression, Function, Literal, Name, Number, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 498, + line: 19, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 499, + line: 19, + col: 32, + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 477, + line: 19, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 484, + line: 19, + col: 17, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 476, + line: 19, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 483, + line: 19, + col: 16, + }, + }, + Name: "request", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 484, + line: 19, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 488, + line: 19, + col: 21, + }, + }, + Name: "args", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 476, + line: 19, + col: 9, + }, + }, + Name: "get", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "type", + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 506, + line: 19, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 509, + line: 19, + col: 42, + }, + }, + Name: "int", + }, + }, + ], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 515, + line: 20, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 521, + line: 20, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 522, + line: 20, + col: 12, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 522, + line: 20, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 529, + line: 20, + col: 19, + }, + }, + Name: "jsonify", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "result", + }, + value: { '@type': "BinOp", + '@role': [Argument, Binary, Expression, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 537, + line: 20, + col: 27, + }, + }, + left: { '@type': "uast:Identifier", + '@role': [Binary, Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 537, + line: 20, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 538, + line: 20, + col: 28, + }, + }, + Name: "a", + }, + op: { '@type': "Add", + '@token': "+", + '@role': [Add, Arithmetic, Binary, Operator], + '@pos': { '@type': "uast:Positions", + }, + }, + right: { '@type': "uast:Identifier", + '@role': [Binary, Expression, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 541, + line: 20, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 542, + line: 20, + col: 32, + }, + }, + Name: "b", + }, + }, + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 546, + line: 23, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 579, + line: 25, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 585, + line: 25, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 586, + line: 25, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 602, + line: 25, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 614, + line: 25, + col: 40, + }, + }, + Format: "", + Value: "index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 586, + line: 25, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 601, + line: 25, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 617, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 619, + line: 27, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 648, + line: 28, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 648, + line: 28, + col: 5, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 649, + line: 28, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 652, + line: 28, + col: 9, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 648, + line: 28, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 651, + line: 28, + col: 8, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 648, + line: 28, + col: 5, + }, + }, + Name: "run", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 620, + line: 27, + col: 4, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 632, + line: 27, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 642, + line: 27, + col: 26, + }, + }, + Format: "", + Value: "__main__", + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 620, + line: 27, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 628, + line: 27, + col: 12, + }, + }, + Name: "__name__", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_55_src.uast b/uast/diff/testdata/testcase_55_src.uast new file mode 100644 index 00000000..da853933 --- /dev/null +++ b/uast/diff/testdata/testcase_55_src.uast @@ -0,0 +1,720 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 229, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 232, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n jQuery Example\n ~~~~~~~~~~~~~~\n\n A simple application that shows how Flask and jQuery get along.\n\n :copyright: (c) 2015 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 233, + line: 11, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 243, + line: 11, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 292, + line: 12, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 292, + line: 12, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 295, + line: 12, + col: 4, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 298, + line: 12, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 304, + line: 12, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 312, + line: 12, + col: 21, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 298, + line: 12, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 303, + line: 12, + col: 12, + }, + }, + Name: "Flask", + }, + keywords: [], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 316, + line: 15, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "add_numbers", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 367, + line: 17, + col: 5, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 367, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 424, + line: 17, + col: 62, + }, + }, + Format: "", + Value: "Add two numbers server side, ridiculous but well...", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 429, + line: 18, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 429, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 430, + line: 18, + col: 6, + }, + }, + Name: "a", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 433, + line: 18, + col: 9, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 450, + line: 18, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 453, + line: 18, + col: 29, + }, + }, + Format: "", + Value: "a", + }, + { '@type': "Num", + '@token': 0, + '@role': [Argument, Call, Expression, Function, Literal, Name, Number, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 455, + line: 18, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 456, + line: 18, + col: 32, + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 434, + line: 18, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 441, + line: 18, + col: 17, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 433, + line: 18, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 440, + line: 18, + col: 16, + }, + }, + Name: "request", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 441, + line: 18, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 445, + line: 18, + col: 21, + }, + }, + Name: "args", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 433, + line: 18, + col: 9, + }, + }, + Name: "get", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "type", + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 463, + line: 18, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 466, + line: 18, + col: 42, + }, + }, + Name: "int", + }, + }, + ], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 472, + line: 19, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 472, + line: 19, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 473, + line: 19, + col: 6, + }, + }, + Name: "b", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 476, + line: 19, + col: 9, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 493, + line: 19, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 496, + line: 19, + col: 29, + }, + }, + Format: "", + Value: "b", + }, + { '@type': "Num", + '@token': 0, + '@role': [Argument, Call, Expression, Function, Literal, Name, Number, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 498, + line: 19, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 499, + line: 19, + col: 32, + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 477, + line: 19, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 484, + line: 19, + col: 17, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 476, + line: 19, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 483, + line: 19, + col: 16, + }, + }, + Name: "request", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 484, + line: 19, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 488, + line: 19, + col: 21, + }, + }, + Name: "args", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 476, + line: 19, + col: 9, + }, + }, + Name: "get", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "type", + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 506, + line: 19, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 509, + line: 19, + col: 42, + }, + }, + Name: "int", + }, + }, + ], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 515, + line: 20, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 521, + line: 20, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 522, + line: 20, + col: 12, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 522, + line: 20, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 529, + line: 20, + col: 19, + }, + }, + Name: "jsonify", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "result", + }, + value: { '@type': "BinOp", + '@role': [Argument, Binary, Expression, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 537, + line: 20, + col: 27, + }, + }, + left: { '@type': "uast:Identifier", + '@role': [Binary, Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 537, + line: 20, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 538, + line: 20, + col: 28, + }, + }, + Name: "a", + }, + op: { '@type': "Add", + '@token': "+", + '@role': [Add, Arithmetic, Binary, Operator], + '@pos': { '@type': "uast:Positions", + }, + }, + right: { '@type': "uast:Identifier", + '@role': [Binary, Expression, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 541, + line: 20, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 542, + line: 20, + col: 32, + }, + }, + Name: "b", + }, + }, + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 546, + line: 23, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 579, + line: 25, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 585, + line: 25, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 586, + line: 25, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 602, + line: 25, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 614, + line: 25, + col: 40, + }, + }, + Format: "", + Value: "index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 586, + line: 25, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 601, + line: 25, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_56_dst.uast b/uast/diff/testdata/testcase_56_dst.uast new file mode 100644 index 00000000..a7eae88a --- /dev/null +++ b/uast/diff/testdata/testcase_56_dst.uast @@ -0,0 +1,843 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 220, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 223, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n tests.deprecations\n ~~~~~~~~~~~~~~~~~~\n\n Tests deprecation support. Not used currently.\n\n :copyright: (c) 2015 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 225, + line: 12, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flask", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 224, + line: 11, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 224, + line: 11, + col: 1, + }, + }, + lines: [], + }, + }, + { '@type': "ClassDef", + '@token': "TestRequestDeprecation", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 246, + line: 15, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 15, + col: 29, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 269, + line: 15, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 275, + line: 15, + col: 36, + }, + }, + Name: "object", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 286, + line: 16, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 303, + line: 16, + col: 26, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "test_request_json", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 341, + line: 17, + col: 9, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 341, + line: 17, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 373, + line: 17, + col: 41, + }, + }, + Format: "", + Value: "Request.json is deprecated", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 383, + line: 19, + col: 9, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 450, + line: 21, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 456, + line: 21, + col: 19, + }, + }, + msg: ~, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 457, + line: 21, + col: 20, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "Dict", + '@role': [Expression, Literal, Map, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 479, + line: 21, + col: 42, + }, + }, + keys: [ + { '@type': "uast:String", + '@role': [Key, Map], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 480, + line: 21, + col: 43, + }, + end: { '@type': "uast:Position", + offset: 486, + line: 21, + col: 49, + }, + }, + Format: "", + Value: "spam", + }, + ], + values: [ + { '@type': "Num", + '@token': 42, + '@role': [Expression, Literal, Map, Number, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 488, + line: 21, + col: 51, + }, + end: { '@type': "uast:Position", + offset: 490, + line: 21, + col: 53, + }, + }, + }, + ], + }, + ], + }, + left: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 458, + line: 21, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 463, + line: 21, + col: 26, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 457, + line: 21, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 462, + line: 21, + col: 25, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 463, + line: 21, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 470, + line: 21, + col: 33, + }, + }, + Name: "request", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 457, + line: 21, + col: 20, + }, + }, + Name: "json", + }, + ], + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 504, + line: 22, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 504, + line: 22, + col: 13, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 511, + line: 22, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 516, + line: 22, + col: 25, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 510, + line: 22, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 515, + line: 22, + col: 24, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 516, + line: 22, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 523, + line: 22, + col: 32, + }, + }, + Name: "request", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 510, + line: 22, + col: 19, + }, + }, + Name: "json", + }, + ], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 504, + line: 22, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 509, + line: 22, + col: 18, + }, + }, + Name: "print", + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 542, + line: 23, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 548, + line: 23, + col: 19, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 549, + line: 23, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 553, + line: 23, + col: 24, + }, + }, + Format: "", + Value: "OK", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 563, + line: 25, + col: 9, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 563, + line: 25, + col: 9, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 575, + line: 25, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 578, + line: 25, + col: 24, + }, + }, + Format: "", + Value: "/", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 564, + line: 25, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 570, + line: 25, + col: 16, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 563, + line: 25, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 569, + line: 25, + col: 15, + }, + }, + Name: "client", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 563, + line: 25, + col: 9, + }, + }, + Name: "post", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "data", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 585, + line: 25, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 599, + line: 25, + col: 45, + }, + }, + Format: "", + Value: "{\"spam\": 42}", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "content_type", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 614, + line: 25, + col: 60, + }, + end: { '@type': "uast:Position", + offset: 632, + line: 25, + col: 78, + }, + }, + Format: "", + Value: "application/json", + }, + }, + ], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 642, + line: 26, + col: 9, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 642, + line: 26, + col: 9, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 654, + line: 26, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 672, + line: 26, + col: 39, + }, + }, + Name: "DeprecationWarning", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 643, + line: 26, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 650, + line: 26, + col: 17, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 642, + line: 26, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 649, + line: 26, + col: 16, + }, + }, + Name: "recwarn", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 642, + line: 26, + col: 9, + }, + }, + Name: "pop", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 304, + line: 16, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 308, + line: 16, + col: 31, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 304, + line: 16, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 308, + line: 16, + col: 31, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 310, + line: 16, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 317, + line: 16, + col: 40, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 310, + line: 16, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 317, + line: 16, + col: 40, + }, + }, + Name: "recwarn", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 319, + line: 16, + col: 42, + }, + end: { '@type': "uast:Position", + offset: 322, + line: 16, + col: 45, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 319, + line: 16, + col: 42, + }, + end: { '@type': "uast:Position", + offset: 322, + line: 16, + col: 45, + }, + }, + Name: "app", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 324, + line: 16, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 330, + line: 16, + col: 53, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 324, + line: 16, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 330, + line: 16, + col: 53, + }, + }, + Name: "client", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_56_src.uast b/uast/diff/testdata/testcase_56_src.uast new file mode 100644 index 00000000..0e24d942 --- /dev/null +++ b/uast/diff/testdata/testcase_56_src.uast @@ -0,0 +1,1430 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 220, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 223, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n tests.deprecations\n ~~~~~~~~~~~~~~~~~~\n\n Tests deprecation support. Not used currently.\n\n :copyright: (c) 2015 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 225, + line: 12, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "pytest", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 224, + line: 11, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 224, + line: 11, + col: 1, + }, + }, + lines: [], + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 240, + line: 14, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flask", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 239, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 239, + line: 13, + col: 1, + }, + }, + lines: [], + }, + }, + { '@type': "ClassDef", + '@token': "TestRequestDeprecation", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 261, + line: 17, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 283, + line: 17, + col: 29, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 284, + line: 17, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 290, + line: 17, + col: 36, + }, + }, + Name: "object", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 301, + line: 18, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 318, + line: 18, + col: 26, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "test_request_json", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 356, + line: 19, + col: 9, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 356, + line: 19, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 388, + line: 19, + col: 41, + }, + }, + Format: "", + Value: "Request.json is deprecated", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 398, + line: 21, + col: 9, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 465, + line: 23, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 471, + line: 23, + col: 19, + }, + }, + msg: ~, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 472, + line: 23, + col: 20, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "Dict", + '@role': [Expression, Literal, Map, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 494, + line: 23, + col: 42, + }, + }, + keys: [ + { '@type': "uast:String", + '@role': [Key, Map], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 495, + line: 23, + col: 43, + }, + end: { '@type': "uast:Position", + offset: 501, + line: 23, + col: 49, + }, + }, + Format: "", + Value: "spam", + }, + ], + values: [ + { '@type': "Num", + '@token': 42, + '@role': [Expression, Literal, Map, Number, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 503, + line: 23, + col: 51, + }, + end: { '@type': "uast:Position", + offset: 505, + line: 23, + col: 53, + }, + }, + }, + ], + }, + ], + }, + left: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 473, + line: 23, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 478, + line: 23, + col: 26, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 472, + line: 23, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 477, + line: 23, + col: 25, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 478, + line: 23, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 485, + line: 23, + col: 33, + }, + }, + Name: "request", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 472, + line: 23, + col: 20, + }, + }, + Name: "json", + }, + ], + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 519, + line: 24, + col: 13, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 519, + line: 24, + col: 13, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 526, + line: 24, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 531, + line: 24, + col: 25, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 525, + line: 24, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 530, + line: 24, + col: 24, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 531, + line: 24, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 538, + line: 24, + col: 32, + }, + }, + Name: "request", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 525, + line: 24, + col: 19, + }, + }, + Name: "json", + }, + ], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 519, + line: 24, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 524, + line: 24, + col: 18, + }, + }, + Name: "print", + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 557, + line: 25, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 563, + line: 25, + col: 19, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 564, + line: 25, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 568, + line: 25, + col: 24, + }, + }, + Format: "", + Value: "OK", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 578, + line: 27, + col: 9, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 578, + line: 27, + col: 9, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 590, + line: 27, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 593, + line: 27, + col: 24, + }, + }, + Format: "", + Value: "/", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 579, + line: 27, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 585, + line: 27, + col: 16, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 578, + line: 27, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 584, + line: 27, + col: 15, + }, + }, + Name: "client", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 578, + line: 27, + col: 9, + }, + }, + Name: "post", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "data", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 600, + line: 27, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 614, + line: 27, + col: 45, + }, + }, + Format: "", + Value: "{\"spam\": 42}", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "content_type", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 629, + line: 27, + col: 60, + }, + end: { '@type': "uast:Position", + offset: 647, + line: 27, + col: 78, + }, + }, + Format: "", + Value: "application/json", + }, + }, + ], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 657, + line: 28, + col: 9, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 657, + line: 28, + col: 9, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 669, + line: 28, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 687, + line: 28, + col: 39, + }, + }, + Name: "DeprecationWarning", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 658, + line: 28, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 665, + line: 28, + col: 17, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 657, + line: 28, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 664, + line: 28, + col: 16, + }, + }, + Name: "recwarn", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 657, + line: 28, + col: 9, + }, + }, + Name: "pop", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 319, + line: 18, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 323, + line: 18, + col: 31, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 319, + line: 18, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 323, + line: 18, + col: 31, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 325, + line: 18, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 332, + line: 18, + col: 40, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 325, + line: 18, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 332, + line: 18, + col: 40, + }, + }, + Name: "recwarn", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 334, + line: 18, + col: 42, + }, + end: { '@type': "uast:Position", + offset: 337, + line: 18, + col: 45, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 334, + line: 18, + col: 42, + }, + end: { '@type': "uast:Position", + offset: 337, + line: 18, + col: 45, + }, + }, + Name: "app", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 339, + line: 18, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 345, + line: 18, + col: 53, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 339, + line: 18, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 345, + line: 18, + col: 53, + }, + }, + Name: "client", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 698, + line: 30, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 717, + line: 30, + col: 28, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "test_request_module", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 755, + line: 31, + col: 9, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 755, + line: 31, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 789, + line: 31, + col: 43, + }, + }, + Format: "", + Value: "Request.module is deprecated", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 799, + line: 33, + col: 9, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 848, + line: 35, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 854, + line: 35, + col: 19, + }, + }, + msg: ~, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 855, + line: 35, + col: 20, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 879, + line: 35, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 883, + line: 35, + col: 48, + }, + }, + LiteralValue: "None", + value: ~, + }, + ], + }, + left: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 856, + line: 35, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 861, + line: 35, + col: 26, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 855, + line: 35, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 860, + line: 35, + col: 25, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 861, + line: 35, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 868, + line: 35, + col: 33, + }, + }, + Name: "request", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 855, + line: 35, + col: 20, + }, + }, + Name: "module", + }, + ], + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Is", + '@token': "is", + '@role': [Identical, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 896, + line: 36, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 902, + line: 36, + col: 19, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 903, + line: 36, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 907, + line: 36, + col: 24, + }, + }, + Format: "", + Value: "OK", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 917, + line: 38, + col: 9, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 917, + line: 38, + col: 9, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 928, + line: 38, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 931, + line: 38, + col: 23, + }, + }, + Format: "", + Value: "/", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 918, + line: 38, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 924, + line: 38, + col: 16, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 917, + line: 38, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 923, + line: 38, + col: 15, + }, + }, + Name: "client", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 917, + line: 38, + col: 9, + }, + }, + Name: "get", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 941, + line: 39, + col: 9, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 941, + line: 39, + col: 9, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 953, + line: 39, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 971, + line: 39, + col: 39, + }, + }, + Name: "DeprecationWarning", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 942, + line: 39, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 949, + line: 39, + col: 17, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 941, + line: 39, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 948, + line: 39, + col: 16, + }, + }, + Name: "recwarn", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 941, + line: 39, + col: 9, + }, + }, + Name: "pop", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 718, + line: 30, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 722, + line: 30, + col: 33, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 718, + line: 30, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 722, + line: 30, + col: 33, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 724, + line: 30, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 731, + line: 30, + col: 42, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 724, + line: 30, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 731, + line: 30, + col: 42, + }, + }, + Name: "recwarn", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 733, + line: 30, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 736, + line: 30, + col: 47, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 733, + line: 30, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 736, + line: 30, + col: 47, + }, + }, + Name: "app", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 738, + line: 30, + col: 49, + }, + end: { '@type': "uast:Position", + offset: 744, + line: 30, + col: 55, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 738, + line: 30, + col: 49, + }, + end: { '@type': "uast:Position", + offset: 744, + line: 30, + col: 55, + }, + }, + Name: "client", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_57_dst.uast b/uast/diff/testdata/testcase_57_dst.uast new file mode 100644 index 00000000..22c066a0 --- /dev/null +++ b/uast/diff/testdata/testcase_57_dst.uast @@ -0,0 +1,306 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 191, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 194, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n Flaskr Tests\n ~~~~~~~~~~~~\n\n Tests the Flaskr application.\n\n :copyright: (c) 2015 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 196, + line: 12, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 211, + line: 12, + col: 16, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "setup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "find_packages", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "setuptools", + }, + Target: ~, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 241, + line: 14, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 241, + line: 14, + col: 1, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 241, + line: 14, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 246, + line: 14, + col: 6, + }, + }, + Name: "setup", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "name", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 15, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 265, + line: 15, + col: 18, + }, + }, + Format: "", + Value: "flaskr", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "packages", + }, + value: { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 280, + line: 16, + col: 14, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 280, + line: 16, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 293, + line: 16, + col: 27, + }, + }, + Name: "find_packages", + }, + keywords: [], + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "include_package_data", + }, + value: { '@type': "BoolLiteral", + '@token': "True", + '@role': [Argument, Boolean, Expression, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 322, + line: 17, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 326, + line: 17, + col: 30, + }, + }, + value: true, + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "install_requires", + }, + value: { '@type': "List", + '@role': [Argument, Expression, List, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 349, + line: 18, + col: 22, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 359, + line: 19, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 366, + line: 19, + col: 16, + }, + }, + Format: "", + Value: "flask", + }, + ], + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "setup_requires", + }, + value: { '@type': "List", + '@role': [Argument, Expression, List, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 394, + line: 21, + col: 20, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 404, + line: 22, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 419, + line: 22, + col: 24, + }, + }, + Format: "", + Value: "pytest-runner", + }, + ], + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "tests_require", + }, + value: { '@type': "List", + '@role': [Argument, Expression, List, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 24, + col: 19, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 456, + line: 25, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 464, + line: 25, + col: 17, + }, + }, + Format: "", + Value: "pytest", + }, + ], + }, + }, + ], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_57_src.uast b/uast/diff/testdata/testcase_57_src.uast new file mode 100644 index 00000000..2de71353 --- /dev/null +++ b/uast/diff/testdata/testcase_57_src.uast @@ -0,0 +1,273 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 15, + line: 1, + col: 16, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "setup", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "setuptools", + }, + Target: ~, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 30, + line: 3, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 30, + line: 3, + col: 1, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 30, + line: 3, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 35, + line: 3, + col: 6, + }, + }, + Name: "setup", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "name", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 46, + line: 4, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 54, + line: 4, + col: 18, + }, + }, + Format: "", + Value: "flaskr", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "packages", + }, + value: { '@type': "List", + '@role': [Argument, Expression, List, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 69, + line: 5, + col: 14, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 70, + line: 5, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 78, + line: 5, + col: 23, + }, + }, + Format: "", + Value: "flaskr", + }, + ], + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "include_package_data", + }, + value: { '@type': "BoolLiteral", + '@token': "True", + '@role': [Argument, Boolean, Expression, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 106, + line: 6, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 110, + line: 6, + col: 30, + }, + }, + value: true, + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "install_requires", + }, + value: { '@type': "List", + '@role': [Argument, Expression, List, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 133, + line: 7, + col: 22, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 143, + line: 8, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 150, + line: 8, + col: 16, + }, + }, + Format: "", + Value: "flask", + }, + ], + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "setup_requires", + }, + value: { '@type': "List", + '@role': [Argument, Expression, List, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 178, + line: 10, + col: 20, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 188, + line: 11, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 203, + line: 11, + col: 24, + }, + }, + Format: "", + Value: "pytest-runner", + }, + ], + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "tests_require", + }, + value: { '@type': "List", + '@role': [Argument, Expression, List, Literal, Primitive, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 230, + line: 13, + col: 19, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 240, + line: 14, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 248, + line: 14, + col: 17, + }, + }, + Format: "", + Value: "pytest", + }, + ], + }, + }, + ], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_58_dst.uast b/uast/diff/testdata/testcase_58_dst.uast new file mode 100644 index 00000000..7e8b9dab --- /dev/null +++ b/uast/diff/testdata/testcase_58_dst.uast @@ -0,0 +1,997 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 246, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 249, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask.globals\n ~~~~~~~~~~~~~\n\n Defines all the global objects that are proxies to the current\n active context.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 251, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 265, + line: 13, + col: 15, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "partial", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "functools", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 281, + line: 14, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 294, + line: 14, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "LocalStack", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "LocalProxy", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 330, + line: 16, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 344, + line: 16, + col: 19, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_lookup_object", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 356, + line: 17, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 356, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 359, + line: 17, + col: 8, + }, + }, + Name: "top", + }, + ], + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 363, + line: 17, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 381, + line: 17, + col: 30, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 362, + line: 17, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 380, + line: 17, + col: 29, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 362, + line: 17, + col: 11, + }, + }, + Name: "top", + }, + ], + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 389, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 391, + line: 18, + col: 7, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Raise", + '@token': "raise", + '@role': [Statement, Throw], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 413, + line: 19, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 418, + line: 19, + col: 14, + }, + }, + cause: ~, + exc: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 419, + line: 19, + col: 15, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 432, + line: 19, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 468, + line: 19, + col: 64, + }, + }, + Format: "", + Value: "working outside of request context", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 419, + line: 19, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 431, + line: 19, + col: 27, + }, + }, + Name: "RuntimeError", + }, + keywords: [], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 392, + line: 18, + col: 8, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 399, + line: 18, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 403, + line: 18, + col: 19, + }, + }, + LiteralValue: "None", + value: ~, + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 392, + line: 18, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 395, + line: 18, + col: 11, + }, + }, + Name: "top", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Is", + '@token': "is", + '@role': [Identical, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 474, + line: 20, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 480, + line: 20, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 481, + line: 20, + col: 12, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 489, + line: 20, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 492, + line: 20, + col: 23, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 494, + line: 20, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 498, + line: 20, + col: 29, + }, + }, + Name: "name", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 481, + line: 20, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 488, + line: 20, + col: 19, + }, + }, + Name: "getattr", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 345, + line: 16, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 349, + line: 16, + col: 24, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 345, + line: 16, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 349, + line: 16, + col: 24, + }, + }, + Name: "name", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 518, + line: 23, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 518, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 536, + line: 23, + col: 19, + }, + }, + Name: "_request_ctx_stack", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 539, + line: 23, + col: 22, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 539, + line: 23, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 549, + line: 23, + col: 32, + }, + }, + Name: "LocalStack", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 552, + line: 24, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 552, + line: 24, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 563, + line: 24, + col: 12, + }, + }, + Name: "current_app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 566, + line: 24, + col: 15, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 577, + line: 24, + col: 26, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 585, + line: 24, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 599, + line: 24, + col: 48, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 601, + line: 24, + col: 50, + }, + end: { '@type': "uast:Position", + offset: 606, + line: 24, + col: 55, + }, + }, + Format: "", + Value: "app", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 577, + line: 24, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 584, + line: 24, + col: 33, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 566, + line: 24, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 576, + line: 24, + col: 25, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 609, + line: 25, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 609, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 616, + line: 25, + col: 8, + }, + }, + Name: "request", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 619, + line: 25, + col: 11, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 630, + line: 25, + col: 22, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 638, + line: 25, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 652, + line: 25, + col: 44, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 654, + line: 25, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 663, + line: 25, + col: 55, + }, + }, + Format: "", + Value: "request", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 630, + line: 25, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 637, + line: 25, + col: 29, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 619, + line: 25, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 629, + line: 25, + col: 21, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 666, + line: 26, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 666, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 673, + line: 26, + col: 8, + }, + }, + Name: "session", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 676, + line: 26, + col: 11, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 687, + line: 26, + col: 22, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 695, + line: 26, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 709, + line: 26, + col: 44, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 711, + line: 26, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 720, + line: 26, + col: 55, + }, + }, + Format: "", + Value: "session", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 687, + line: 26, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 694, + line: 26, + col: 29, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 676, + line: 26, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 686, + line: 26, + col: 21, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 723, + line: 27, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 723, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 724, + line: 27, + col: 2, + }, + }, + Name: "g", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 727, + line: 27, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 738, + line: 27, + col: 16, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 746, + line: 27, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 760, + line: 27, + col: 38, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 762, + line: 27, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 765, + line: 27, + col: 43, + }, + }, + Format: "", + Value: "g", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 738, + line: 27, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 745, + line: 27, + col: 23, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 727, + line: 27, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 737, + line: 27, + col: 15, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_58_src.uast b/uast/diff/testdata/testcase_58_src.uast new file mode 100644 index 00000000..5f515f47 --- /dev/null +++ b/uast/diff/testdata/testcase_58_src.uast @@ -0,0 +1,682 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 246, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 249, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask.globals\n ~~~~~~~~~~~~~\n\n Defines all the global objects that are proxies to the current\n active context.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 251, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 264, + line: 13, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "LocalStack", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "LocalProxy", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 313, + line: 16, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 313, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 331, + line: 16, + col: 19, + }, + }, + Name: "_request_ctx_stack", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 334, + line: 16, + col: 22, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 334, + line: 16, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 344, + line: 16, + col: 32, + }, + }, + Name: "LocalStack", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 347, + line: 17, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 347, + line: 17, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 358, + line: 17, + col: 12, + }, + }, + Name: "current_app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 361, + line: 17, + col: 15, + }, + }, + args: [ + { '@type': "Lambda", + '@role': [Anonymous, Argument, Call, Declaration, Function, Name, Positional, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 372, + line: 17, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 378, + line: 17, + col: 32, + }, + }, + args: { '@type': "arguments", + '@role': [Argument, Declaration, Function, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + args: [], + }, + body: { '@type': "FunctionDef.body", + '@role': [Body, Declaration, Function], + 'body_stmts': { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 381, + line: 17, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 399, + line: 17, + col: 53, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 380, + line: 17, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 398, + line: 17, + col: 52, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 399, + line: 17, + col: 53, + }, + end: { '@type': "uast:Position", + offset: 402, + line: 17, + col: 56, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 380, + line: 17, + col: 34, + }, + }, + Name: "app", + }, + ], + }, + }, + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 361, + line: 17, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 371, + line: 17, + col: 25, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 408, + line: 18, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 408, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 415, + line: 18, + col: 8, + }, + }, + Name: "request", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 418, + line: 18, + col: 11, + }, + }, + args: [ + { '@type': "Lambda", + '@role': [Anonymous, Argument, Call, Declaration, Function, Name, Positional, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 429, + line: 18, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 435, + line: 18, + col: 28, + }, + }, + args: { '@type': "arguments", + '@role': [Argument, Declaration, Function, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + args: [], + }, + body: { '@type': "FunctionDef.body", + '@role': [Body, Declaration, Function], + 'body_stmts': { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 438, + line: 18, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 456, + line: 18, + col: 49, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 437, + line: 18, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 455, + line: 18, + col: 48, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 456, + line: 18, + col: 49, + }, + end: { '@type': "uast:Position", + offset: 459, + line: 18, + col: 52, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 437, + line: 18, + col: 30, + }, + }, + Name: "request", + }, + ], + }, + }, + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 418, + line: 18, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 428, + line: 18, + col: 21, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 469, + line: 19, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 469, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 476, + line: 19, + col: 8, + }, + }, + Name: "session", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 479, + line: 19, + col: 11, + }, + }, + args: [ + { '@type': "Lambda", + '@role': [Anonymous, Argument, Call, Declaration, Function, Name, Positional, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 490, + line: 19, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 496, + line: 19, + col: 28, + }, + }, + args: { '@type': "arguments", + '@role': [Argument, Declaration, Function, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + args: [], + }, + body: { '@type': "FunctionDef.body", + '@role': [Body, Declaration, Function], + 'body_stmts': { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 499, + line: 19, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 517, + line: 19, + col: 49, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 498, + line: 19, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 516, + line: 19, + col: 48, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 517, + line: 19, + col: 49, + }, + end: { '@type': "uast:Position", + offset: 520, + line: 19, + col: 52, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 498, + line: 19, + col: 30, + }, + }, + Name: "session", + }, + ], + }, + }, + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 479, + line: 19, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 489, + line: 19, + col: 21, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 530, + line: 20, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 530, + line: 20, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 531, + line: 20, + col: 2, + }, + }, + Name: "g", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 534, + line: 20, + col: 5, + }, + }, + args: [ + { '@type': "Lambda", + '@role': [Anonymous, Argument, Call, Declaration, Function, Name, Positional, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 545, + line: 20, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 551, + line: 20, + col: 22, + }, + }, + args: { '@type': "arguments", + '@role': [Argument, Declaration, Function, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + args: [], + }, + body: { '@type': "FunctionDef.body", + '@role': [Body, Declaration, Function], + 'body_stmts': { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 554, + line: 20, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 572, + line: 20, + col: 43, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 553, + line: 20, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 571, + line: 20, + col: 42, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 572, + line: 20, + col: 43, + }, + end: { '@type': "uast:Position", + offset: 575, + line: 20, + col: 46, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 553, + line: 20, + col: 24, + }, + }, + Name: "g", + }, + ], + }, + }, + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 534, + line: 20, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 544, + line: 20, + col: 15, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_59_dst.uast b/uast/diff/testdata/testcase_59_dst.uast new file mode 100644 index 00000000..aa8a8d65 --- /dev/null +++ b/uast/diff/testdata/testcase_59_dst.uast @@ -0,0 +1,992 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 246, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 249, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask.globals\n ~~~~~~~~~~~~~\n\n Defines all the global objects that are proxies to the current\n active context.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 251, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 265, + line: 13, + col: 15, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "partial", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "functools", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 281, + line: 14, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "LocalStack", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "LocalProxy", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.local", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 336, + line: 16, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 350, + line: 16, + col: 19, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_lookup_object", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 362, + line: 17, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 362, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 365, + line: 17, + col: 8, + }, + }, + Name: "top", + }, + ], + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 369, + line: 17, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 387, + line: 17, + col: 30, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 368, + line: 17, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 386, + line: 17, + col: 29, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 368, + line: 17, + col: 11, + }, + }, + Name: "top", + }, + ], + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 395, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 397, + line: 18, + col: 7, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Raise", + '@token': "raise", + '@role': [Statement, Throw], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 419, + line: 19, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 424, + line: 19, + col: 14, + }, + }, + cause: ~, + exc: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 425, + line: 19, + col: 15, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 438, + line: 19, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 474, + line: 19, + col: 64, + }, + }, + Format: "", + Value: "working outside of request context", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 425, + line: 19, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 437, + line: 19, + col: 27, + }, + }, + Name: "RuntimeError", + }, + keywords: [], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 398, + line: 18, + col: 8, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 405, + line: 18, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 409, + line: 18, + col: 19, + }, + }, + LiteralValue: "None", + value: ~, + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 398, + line: 18, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 401, + line: 18, + col: 11, + }, + }, + Name: "top", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Is", + '@token': "is", + '@role': [Identical, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 480, + line: 20, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 486, + line: 20, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 487, + line: 20, + col: 12, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 495, + line: 20, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 498, + line: 20, + col: 23, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 500, + line: 20, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 504, + line: 20, + col: 29, + }, + }, + Name: "name", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 487, + line: 20, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 494, + line: 20, + col: 19, + }, + }, + Name: "getattr", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 351, + line: 16, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 355, + line: 16, + col: 24, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 351, + line: 16, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 355, + line: 16, + col: 24, + }, + }, + Name: "name", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 524, + line: 23, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 524, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 542, + line: 23, + col: 19, + }, + }, + Name: "_request_ctx_stack", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 545, + line: 23, + col: 22, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 545, + line: 23, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 555, + line: 23, + col: 32, + }, + }, + Name: "LocalStack", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 558, + line: 24, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 558, + line: 24, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 569, + line: 24, + col: 12, + }, + }, + Name: "current_app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 572, + line: 24, + col: 15, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 583, + line: 24, + col: 26, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 591, + line: 24, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 605, + line: 24, + col: 48, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 607, + line: 24, + col: 50, + }, + end: { '@type': "uast:Position", + offset: 612, + line: 24, + col: 55, + }, + }, + Format: "", + Value: "app", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 583, + line: 24, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 590, + line: 24, + col: 33, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 572, + line: 24, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 582, + line: 24, + col: 25, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 615, + line: 25, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 615, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 622, + line: 25, + col: 8, + }, + }, + Name: "request", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 625, + line: 25, + col: 11, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 636, + line: 25, + col: 22, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 644, + line: 25, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 658, + line: 25, + col: 44, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 660, + line: 25, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 669, + line: 25, + col: 55, + }, + }, + Format: "", + Value: "request", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 636, + line: 25, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 643, + line: 25, + col: 29, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 625, + line: 25, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 635, + line: 25, + col: 21, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 672, + line: 26, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 672, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 679, + line: 26, + col: 8, + }, + }, + Name: "session", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 682, + line: 26, + col: 11, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 693, + line: 26, + col: 22, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 701, + line: 26, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 715, + line: 26, + col: 44, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 717, + line: 26, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 726, + line: 26, + col: 55, + }, + }, + Format: "", + Value: "session", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 693, + line: 26, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 700, + line: 26, + col: 29, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 682, + line: 26, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 692, + line: 26, + col: 21, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 729, + line: 27, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 729, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 730, + line: 27, + col: 2, + }, + }, + Name: "g", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 733, + line: 27, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 744, + line: 27, + col: 16, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 752, + line: 27, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 766, + line: 27, + col: 38, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 768, + line: 27, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 771, + line: 27, + col: 43, + }, + }, + Format: "", + Value: "g", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 744, + line: 27, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 751, + line: 27, + col: 23, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 733, + line: 27, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 743, + line: 27, + col: 15, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_59_src.uast b/uast/diff/testdata/testcase_59_src.uast new file mode 100644 index 00000000..7e8b9dab --- /dev/null +++ b/uast/diff/testdata/testcase_59_src.uast @@ -0,0 +1,997 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 246, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 249, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask.globals\n ~~~~~~~~~~~~~\n\n Defines all the global objects that are proxies to the current\n active context.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 251, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 265, + line: 13, + col: 15, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "partial", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "functools", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 281, + line: 14, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 294, + line: 14, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "LocalStack", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "LocalProxy", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 330, + line: 16, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 344, + line: 16, + col: 19, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_lookup_object", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 356, + line: 17, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 356, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 359, + line: 17, + col: 8, + }, + }, + Name: "top", + }, + ], + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 363, + line: 17, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 381, + line: 17, + col: 30, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 362, + line: 17, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 380, + line: 17, + col: 29, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 362, + line: 17, + col: 11, + }, + }, + Name: "top", + }, + ], + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 389, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 391, + line: 18, + col: 7, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Raise", + '@token': "raise", + '@role': [Statement, Throw], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 413, + line: 19, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 418, + line: 19, + col: 14, + }, + }, + cause: ~, + exc: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 419, + line: 19, + col: 15, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 432, + line: 19, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 468, + line: 19, + col: 64, + }, + }, + Format: "", + Value: "working outside of request context", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 419, + line: 19, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 431, + line: 19, + col: 27, + }, + }, + Name: "RuntimeError", + }, + keywords: [], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 392, + line: 18, + col: 8, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 399, + line: 18, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 403, + line: 18, + col: 19, + }, + }, + LiteralValue: "None", + value: ~, + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 392, + line: 18, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 395, + line: 18, + col: 11, + }, + }, + Name: "top", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Is", + '@token': "is", + '@role': [Identical, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 474, + line: 20, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 480, + line: 20, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 481, + line: 20, + col: 12, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 489, + line: 20, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 492, + line: 20, + col: 23, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 494, + line: 20, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 498, + line: 20, + col: 29, + }, + }, + Name: "name", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 481, + line: 20, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 488, + line: 20, + col: 19, + }, + }, + Name: "getattr", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 345, + line: 16, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 349, + line: 16, + col: 24, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 345, + line: 16, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 349, + line: 16, + col: 24, + }, + }, + Name: "name", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 518, + line: 23, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 518, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 536, + line: 23, + col: 19, + }, + }, + Name: "_request_ctx_stack", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 539, + line: 23, + col: 22, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 539, + line: 23, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 549, + line: 23, + col: 32, + }, + }, + Name: "LocalStack", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 552, + line: 24, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 552, + line: 24, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 563, + line: 24, + col: 12, + }, + }, + Name: "current_app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 566, + line: 24, + col: 15, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 577, + line: 24, + col: 26, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 585, + line: 24, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 599, + line: 24, + col: 48, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 601, + line: 24, + col: 50, + }, + end: { '@type': "uast:Position", + offset: 606, + line: 24, + col: 55, + }, + }, + Format: "", + Value: "app", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 577, + line: 24, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 584, + line: 24, + col: 33, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 566, + line: 24, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 576, + line: 24, + col: 25, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 609, + line: 25, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 609, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 616, + line: 25, + col: 8, + }, + }, + Name: "request", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 619, + line: 25, + col: 11, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 630, + line: 25, + col: 22, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 638, + line: 25, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 652, + line: 25, + col: 44, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 654, + line: 25, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 663, + line: 25, + col: 55, + }, + }, + Format: "", + Value: "request", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 630, + line: 25, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 637, + line: 25, + col: 29, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 619, + line: 25, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 629, + line: 25, + col: 21, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 666, + line: 26, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 666, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 673, + line: 26, + col: 8, + }, + }, + Name: "session", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 676, + line: 26, + col: 11, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 687, + line: 26, + col: 22, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 695, + line: 26, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 709, + line: 26, + col: 44, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 711, + line: 26, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 720, + line: 26, + col: 55, + }, + }, + Format: "", + Value: "session", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 687, + line: 26, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 694, + line: 26, + col: 29, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 676, + line: 26, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 686, + line: 26, + col: 21, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 723, + line: 27, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 723, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 724, + line: 27, + col: 2, + }, + }, + Name: "g", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 727, + line: 27, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 738, + line: 27, + col: 16, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 746, + line: 27, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 760, + line: 27, + col: 38, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 762, + line: 27, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 765, + line: 27, + col: 43, + }, + }, + Format: "", + Value: "g", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 738, + line: 27, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 745, + line: 27, + col: 23, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 727, + line: 27, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 737, + line: 27, + col: 15, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_5_dst.uast b/uast/diff/testdata/testcase_5_dst.uast new file mode 100644 index 00000000..4c15dc9b --- /dev/null +++ b/uast/diff/testdata/testcase_5_dst.uast @@ -0,0 +1,69 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 22, + line: 2, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "main", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.testsuite", + }, + Target: ~, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 55, + line: 3, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 55, + line: 3, + col: 1, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 55, + line: 3, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 59, + line: 3, + col: 5, + }, + }, + Name: "main", + }, + keywords: [], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_5_src.uast b/uast/diff/testdata/testcase_5_src.uast new file mode 100644 index 00000000..ba157e75 --- /dev/null +++ b/uast/diff/testdata/testcase_5_src.uast @@ -0,0 +1,69 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "main", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.testsuite", + }, + Target: ~, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 33, + line: 2, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 33, + line: 2, + col: 1, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 33, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 37, + line: 2, + col: 5, + }, + }, + Name: "main", + }, + keywords: [], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_60_dst.uast b/uast/diff/testdata/testcase_60_dst.uast new file mode 100644 index 00000000..4d9f3719 --- /dev/null +++ b/uast/diff/testdata/testcase_60_dst.uast @@ -0,0 +1,992 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 246, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 249, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask.globals\n ~~~~~~~~~~~~~\n\n Defines all the global objects that are proxies to the current\n active context.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 251, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 265, + line: 13, + col: 15, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "partial", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "functools", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 281, + line: 14, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "LocalStack", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "LocalProxy", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.local", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 336, + line: 16, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 350, + line: 16, + col: 19, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_lookup_object", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 362, + line: 17, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 362, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 365, + line: 17, + col: 8, + }, + }, + Name: "top", + }, + ], + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 369, + line: 17, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 387, + line: 17, + col: 30, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 368, + line: 17, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 386, + line: 17, + col: 29, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 368, + line: 17, + col: 11, + }, + }, + Name: "top", + }, + ], + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 395, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 397, + line: 18, + col: 7, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Raise", + '@token': "raise", + '@role': [Statement, Throw], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 419, + line: 19, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 424, + line: 19, + col: 14, + }, + }, + cause: ~, + exc: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 425, + line: 19, + col: 15, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 438, + line: 19, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 474, + line: 19, + col: 64, + }, + }, + Format: "", + Value: "working outside of request context", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 425, + line: 19, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 437, + line: 19, + col: 27, + }, + }, + Name: "RuntimeError", + }, + keywords: [], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 398, + line: 18, + col: 8, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 405, + line: 18, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 409, + line: 18, + col: 19, + }, + }, + LiteralValue: "None", + value: ~, + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 398, + line: 18, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 401, + line: 18, + col: 11, + }, + }, + Name: "top", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Is", + '@token': "is", + '@role': [Identical, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 480, + line: 20, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 486, + line: 20, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 487, + line: 20, + col: 12, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 495, + line: 20, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 498, + line: 20, + col: 23, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 500, + line: 20, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 504, + line: 20, + col: 29, + }, + }, + Name: "name", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 487, + line: 20, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 494, + line: 20, + col: 19, + }, + }, + Name: "getattr", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 351, + line: 16, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 355, + line: 16, + col: 24, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 351, + line: 16, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 355, + line: 16, + col: 24, + }, + }, + Name: "name", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 524, + line: 23, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 524, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 542, + line: 23, + col: 19, + }, + }, + Name: "_request_ctx_stack", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 545, + line: 23, + col: 22, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 545, + line: 23, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 555, + line: 23, + col: 32, + }, + }, + Name: "LocalStack", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 558, + line: 24, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 558, + line: 24, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 569, + line: 24, + col: 12, + }, + }, + Name: "current_app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 572, + line: 24, + col: 15, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 583, + line: 24, + col: 26, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 591, + line: 24, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 605, + line: 24, + col: 48, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 607, + line: 24, + col: 50, + }, + end: { '@type': "uast:Position", + offset: 612, + line: 24, + col: 55, + }, + }, + Format: "", + Value: "app", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 583, + line: 24, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 590, + line: 24, + col: 33, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 572, + line: 24, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 582, + line: 24, + col: 25, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 615, + line: 25, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 615, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 622, + line: 25, + col: 8, + }, + }, + Name: "request", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 625, + line: 25, + col: 11, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 636, + line: 25, + col: 22, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 644, + line: 25, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 658, + line: 25, + col: 44, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 660, + line: 25, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 669, + line: 25, + col: 55, + }, + }, + Format: "", + Value: "request", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 636, + line: 25, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 643, + line: 25, + col: 29, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 625, + line: 25, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 635, + line: 25, + col: 21, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 672, + line: 26, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 672, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 679, + line: 26, + col: 8, + }, + }, + Name: "session", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 682, + line: 26, + col: 11, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 693, + line: 26, + col: 22, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 701, + line: 26, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 715, + line: 26, + col: 44, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 717, + line: 26, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 726, + line: 26, + col: 55, + }, + }, + Format: "", + Value: "session", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 693, + line: 26, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 700, + line: 26, + col: 29, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 682, + line: 26, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 692, + line: 26, + col: 21, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 729, + line: 27, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 729, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 730, + line: 27, + col: 2, + }, + }, + Name: "g", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 733, + line: 27, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 744, + line: 27, + col: 16, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 752, + line: 27, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 766, + line: 27, + col: 38, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 768, + line: 27, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 771, + line: 27, + col: 43, + }, + }, + Format: "", + Value: "g", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 744, + line: 27, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 751, + line: 27, + col: 23, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 733, + line: 27, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 743, + line: 27, + col: 15, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_60_src.uast b/uast/diff/testdata/testcase_60_src.uast new file mode 100644 index 00000000..aa8a8d65 --- /dev/null +++ b/uast/diff/testdata/testcase_60_src.uast @@ -0,0 +1,992 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 246, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 249, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask.globals\n ~~~~~~~~~~~~~\n\n Defines all the global objects that are proxies to the current\n active context.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 251, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 265, + line: 13, + col: 15, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "partial", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "functools", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 281, + line: 14, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "LocalStack", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "LocalProxy", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.local", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 336, + line: 16, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 350, + line: 16, + col: 19, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_lookup_object", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 362, + line: 17, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 362, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 365, + line: 17, + col: 8, + }, + }, + Name: "top", + }, + ], + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 369, + line: 17, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 387, + line: 17, + col: 30, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 368, + line: 17, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 386, + line: 17, + col: 29, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 368, + line: 17, + col: 11, + }, + }, + Name: "top", + }, + ], + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 395, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 397, + line: 18, + col: 7, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Raise", + '@token': "raise", + '@role': [Statement, Throw], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 419, + line: 19, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 424, + line: 19, + col: 14, + }, + }, + cause: ~, + exc: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 425, + line: 19, + col: 15, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 438, + line: 19, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 474, + line: 19, + col: 64, + }, + }, + Format: "", + Value: "working outside of request context", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 425, + line: 19, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 437, + line: 19, + col: 27, + }, + }, + Name: "RuntimeError", + }, + keywords: [], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 398, + line: 18, + col: 8, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 405, + line: 18, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 409, + line: 18, + col: 19, + }, + }, + LiteralValue: "None", + value: ~, + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 398, + line: 18, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 401, + line: 18, + col: 11, + }, + }, + Name: "top", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Is", + '@token': "is", + '@role': [Identical, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 480, + line: 20, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 486, + line: 20, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 487, + line: 20, + col: 12, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 495, + line: 20, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 498, + line: 20, + col: 23, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 500, + line: 20, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 504, + line: 20, + col: 29, + }, + }, + Name: "name", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 487, + line: 20, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 494, + line: 20, + col: 19, + }, + }, + Name: "getattr", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 351, + line: 16, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 355, + line: 16, + col: 24, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 351, + line: 16, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 355, + line: 16, + col: 24, + }, + }, + Name: "name", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 524, + line: 23, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 524, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 542, + line: 23, + col: 19, + }, + }, + Name: "_request_ctx_stack", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 545, + line: 23, + col: 22, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 545, + line: 23, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 555, + line: 23, + col: 32, + }, + }, + Name: "LocalStack", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 558, + line: 24, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 558, + line: 24, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 569, + line: 24, + col: 12, + }, + }, + Name: "current_app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 572, + line: 24, + col: 15, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 583, + line: 24, + col: 26, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 591, + line: 24, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 605, + line: 24, + col: 48, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 607, + line: 24, + col: 50, + }, + end: { '@type': "uast:Position", + offset: 612, + line: 24, + col: 55, + }, + }, + Format: "", + Value: "app", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 583, + line: 24, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 590, + line: 24, + col: 33, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 572, + line: 24, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 582, + line: 24, + col: 25, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 615, + line: 25, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 615, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 622, + line: 25, + col: 8, + }, + }, + Name: "request", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 625, + line: 25, + col: 11, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 636, + line: 25, + col: 22, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 644, + line: 25, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 658, + line: 25, + col: 44, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 660, + line: 25, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 669, + line: 25, + col: 55, + }, + }, + Format: "", + Value: "request", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 636, + line: 25, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 643, + line: 25, + col: 29, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 625, + line: 25, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 635, + line: 25, + col: 21, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 672, + line: 26, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 672, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 679, + line: 26, + col: 8, + }, + }, + Name: "session", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 682, + line: 26, + col: 11, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 693, + line: 26, + col: 22, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 701, + line: 26, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 715, + line: 26, + col: 44, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 717, + line: 26, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 726, + line: 26, + col: 55, + }, + }, + Format: "", + Value: "session", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 693, + line: 26, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 700, + line: 26, + col: 29, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 682, + line: 26, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 692, + line: 26, + col: 21, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 729, + line: 27, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 729, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 730, + line: 27, + col: 2, + }, + }, + Name: "g", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 733, + line: 27, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 744, + line: 27, + col: 16, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 752, + line: 27, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 766, + line: 27, + col: 38, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 768, + line: 27, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 771, + line: 27, + col: 43, + }, + }, + Format: "", + Value: "g", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 744, + line: 27, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 751, + line: 27, + col: 23, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 733, + line: 27, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 743, + line: 27, + col: 15, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_61_dst.uast b/uast/diff/testdata/testcase_61_dst.uast new file mode 100644 index 00000000..20208574 --- /dev/null +++ b/uast/diff/testdata/testcase_61_dst.uast @@ -0,0 +1,992 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 246, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 249, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask.globals\n ~~~~~~~~~~~~~\n\n Defines all the global objects that are proxies to the current\n active context.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 251, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 265, + line: 13, + col: 15, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "partial", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "functools", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 281, + line: 14, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "LocalStack", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "LocalProxy", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.local", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 336, + line: 16, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 350, + line: 16, + col: 19, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_lookup_object", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 362, + line: 17, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 362, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 365, + line: 17, + col: 8, + }, + }, + Name: "top", + }, + ], + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 369, + line: 17, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 387, + line: 17, + col: 30, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 368, + line: 17, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 386, + line: 17, + col: 29, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 368, + line: 17, + col: 11, + }, + }, + Name: "top", + }, + ], + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 395, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 397, + line: 18, + col: 7, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Raise", + '@token': "raise", + '@role': [Statement, Throw], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 419, + line: 19, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 424, + line: 19, + col: 14, + }, + }, + cause: ~, + exc: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 425, + line: 19, + col: 15, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 438, + line: 19, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 474, + line: 19, + col: 64, + }, + }, + Format: "", + Value: "working outside of request context", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 425, + line: 19, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 437, + line: 19, + col: 27, + }, + }, + Name: "RuntimeError", + }, + keywords: [], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 398, + line: 18, + col: 8, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 405, + line: 18, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 409, + line: 18, + col: 19, + }, + }, + LiteralValue: "None", + value: ~, + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 398, + line: 18, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 401, + line: 18, + col: 11, + }, + }, + Name: "top", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Is", + '@token': "is", + '@role': [Identical, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 480, + line: 20, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 486, + line: 20, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 487, + line: 20, + col: 12, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 495, + line: 20, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 498, + line: 20, + col: 23, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 500, + line: 20, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 504, + line: 20, + col: 29, + }, + }, + Name: "name", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 487, + line: 20, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 494, + line: 20, + col: 19, + }, + }, + Name: "getattr", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 351, + line: 16, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 355, + line: 16, + col: 24, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 351, + line: 16, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 355, + line: 16, + col: 24, + }, + }, + Name: "name", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 525, + line: 24, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 525, + line: 24, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 543, + line: 24, + col: 19, + }, + }, + Name: "_request_ctx_stack", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 546, + line: 24, + col: 22, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 546, + line: 24, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 556, + line: 24, + col: 32, + }, + }, + Name: "LocalStack", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 559, + line: 25, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 559, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 570, + line: 25, + col: 12, + }, + }, + Name: "current_app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 573, + line: 25, + col: 15, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 584, + line: 25, + col: 26, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 592, + line: 25, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 606, + line: 25, + col: 48, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 608, + line: 25, + col: 50, + }, + end: { '@type': "uast:Position", + offset: 613, + line: 25, + col: 55, + }, + }, + Format: "", + Value: "app", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 584, + line: 25, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 591, + line: 25, + col: 33, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 573, + line: 25, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 583, + line: 25, + col: 25, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 616, + line: 26, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 616, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 623, + line: 26, + col: 8, + }, + }, + Name: "request", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 626, + line: 26, + col: 11, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 637, + line: 26, + col: 22, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 645, + line: 26, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 659, + line: 26, + col: 44, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 661, + line: 26, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 670, + line: 26, + col: 55, + }, + }, + Format: "", + Value: "request", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 637, + line: 26, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 644, + line: 26, + col: 29, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 626, + line: 26, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 636, + line: 26, + col: 21, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 673, + line: 27, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 673, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 680, + line: 27, + col: 8, + }, + }, + Name: "session", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 683, + line: 27, + col: 11, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 694, + line: 27, + col: 22, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 702, + line: 27, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 716, + line: 27, + col: 44, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 718, + line: 27, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 727, + line: 27, + col: 55, + }, + }, + Format: "", + Value: "session", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 694, + line: 27, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 701, + line: 27, + col: 29, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 683, + line: 27, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 693, + line: 27, + col: 21, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 730, + line: 28, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 730, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 731, + line: 28, + col: 2, + }, + }, + Name: "g", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 734, + line: 28, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 745, + line: 28, + col: 16, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 753, + line: 28, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 767, + line: 28, + col: 38, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 769, + line: 28, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 772, + line: 28, + col: 43, + }, + }, + Format: "", + Value: "g", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 745, + line: 28, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 752, + line: 28, + col: 23, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 734, + line: 28, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 744, + line: 28, + col: 15, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_61_src.uast b/uast/diff/testdata/testcase_61_src.uast new file mode 100644 index 00000000..4d9f3719 --- /dev/null +++ b/uast/diff/testdata/testcase_61_src.uast @@ -0,0 +1,992 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 246, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 249, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask.globals\n ~~~~~~~~~~~~~\n\n Defines all the global objects that are proxies to the current\n active context.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 251, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 265, + line: 13, + col: 15, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "partial", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "functools", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 281, + line: 14, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "LocalStack", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "LocalProxy", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.local", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 336, + line: 16, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 350, + line: 16, + col: 19, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_lookup_object", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 362, + line: 17, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 362, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 365, + line: 17, + col: 8, + }, + }, + Name: "top", + }, + ], + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 369, + line: 17, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 387, + line: 17, + col: 30, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 368, + line: 17, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 386, + line: 17, + col: 29, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 368, + line: 17, + col: 11, + }, + }, + Name: "top", + }, + ], + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 395, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 397, + line: 18, + col: 7, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Raise", + '@token': "raise", + '@role': [Statement, Throw], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 419, + line: 19, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 424, + line: 19, + col: 14, + }, + }, + cause: ~, + exc: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 425, + line: 19, + col: 15, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 438, + line: 19, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 474, + line: 19, + col: 64, + }, + }, + Format: "", + Value: "working outside of request context", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 425, + line: 19, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 437, + line: 19, + col: 27, + }, + }, + Name: "RuntimeError", + }, + keywords: [], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 398, + line: 18, + col: 8, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 405, + line: 18, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 409, + line: 18, + col: 19, + }, + }, + LiteralValue: "None", + value: ~, + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 398, + line: 18, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 401, + line: 18, + col: 11, + }, + }, + Name: "top", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Is", + '@token': "is", + '@role': [Identical, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 480, + line: 20, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 486, + line: 20, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 487, + line: 20, + col: 12, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 495, + line: 20, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 498, + line: 20, + col: 23, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 500, + line: 20, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 504, + line: 20, + col: 29, + }, + }, + Name: "name", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 487, + line: 20, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 494, + line: 20, + col: 19, + }, + }, + Name: "getattr", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 351, + line: 16, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 355, + line: 16, + col: 24, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 351, + line: 16, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 355, + line: 16, + col: 24, + }, + }, + Name: "name", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 524, + line: 23, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 524, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 542, + line: 23, + col: 19, + }, + }, + Name: "_request_ctx_stack", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 545, + line: 23, + col: 22, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 545, + line: 23, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 555, + line: 23, + col: 32, + }, + }, + Name: "LocalStack", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 558, + line: 24, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 558, + line: 24, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 569, + line: 24, + col: 12, + }, + }, + Name: "current_app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 572, + line: 24, + col: 15, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 583, + line: 24, + col: 26, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 591, + line: 24, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 605, + line: 24, + col: 48, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 607, + line: 24, + col: 50, + }, + end: { '@type': "uast:Position", + offset: 612, + line: 24, + col: 55, + }, + }, + Format: "", + Value: "app", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 583, + line: 24, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 590, + line: 24, + col: 33, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 572, + line: 24, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 582, + line: 24, + col: 25, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 615, + line: 25, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 615, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 622, + line: 25, + col: 8, + }, + }, + Name: "request", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 625, + line: 25, + col: 11, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 636, + line: 25, + col: 22, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 644, + line: 25, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 658, + line: 25, + col: 44, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 660, + line: 25, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 669, + line: 25, + col: 55, + }, + }, + Format: "", + Value: "request", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 636, + line: 25, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 643, + line: 25, + col: 29, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 625, + line: 25, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 635, + line: 25, + col: 21, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 672, + line: 26, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 672, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 679, + line: 26, + col: 8, + }, + }, + Name: "session", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 682, + line: 26, + col: 11, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 693, + line: 26, + col: 22, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 701, + line: 26, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 715, + line: 26, + col: 44, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 717, + line: 26, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 726, + line: 26, + col: 55, + }, + }, + Format: "", + Value: "session", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 693, + line: 26, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 700, + line: 26, + col: 29, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 682, + line: 26, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 692, + line: 26, + col: 21, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 729, + line: 27, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 729, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 730, + line: 27, + col: 2, + }, + }, + Name: "g", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 733, + line: 27, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 744, + line: 27, + col: 16, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 752, + line: 27, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 766, + line: 27, + col: 38, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 768, + line: 27, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 771, + line: 27, + col: 43, + }, + }, + Format: "", + Value: "g", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 744, + line: 27, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 751, + line: 27, + col: 23, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 733, + line: 27, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 743, + line: 27, + col: 15, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_62_dst.uast b/uast/diff/testdata/testcase_62_dst.uast new file mode 100644 index 00000000..789f7077 --- /dev/null +++ b/uast/diff/testdata/testcase_62_dst.uast @@ -0,0 +1,869 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 229, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 232, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n jQuery Example\n ~~~~~~~~~~~~~~\n\n A simple application that shows how Flask and jQuery get along.\n\n :copyright: (c) 2015 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 233, + line: 11, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 243, + line: 11, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 292, + line: 12, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 292, + line: 12, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 295, + line: 12, + col: 4, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 298, + line: 12, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 304, + line: 12, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 312, + line: 12, + col: 21, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 298, + line: 12, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 303, + line: 12, + col: 12, + }, + }, + Name: "Flask", + }, + keywords: [], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 316, + line: 15, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "add_numbers", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 367, + line: 17, + col: 5, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 367, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 424, + line: 17, + col: 62, + }, + }, + Format: "", + Value: "Add two numbers server side, ridiculous but well...", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 429, + line: 18, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 429, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 430, + line: 18, + col: 6, + }, + }, + Name: "a", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 433, + line: 18, + col: 9, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 450, + line: 18, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 453, + line: 18, + col: 29, + }, + }, + Format: "", + Value: "a", + }, + { '@type': "Num", + '@token': 0, + '@role': [Argument, Call, Expression, Function, Literal, Name, Number, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 455, + line: 18, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 456, + line: 18, + col: 32, + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 434, + line: 18, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 441, + line: 18, + col: 17, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 433, + line: 18, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 440, + line: 18, + col: 16, + }, + }, + Name: "request", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 441, + line: 18, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 445, + line: 18, + col: 21, + }, + }, + Name: "args", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 433, + line: 18, + col: 9, + }, + }, + Name: "get", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "type", + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 463, + line: 18, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 466, + line: 18, + col: 42, + }, + }, + Name: "int", + }, + }, + ], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 472, + line: 19, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 472, + line: 19, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 473, + line: 19, + col: 6, + }, + }, + Name: "b", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 476, + line: 19, + col: 9, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 493, + line: 19, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 496, + line: 19, + col: 29, + }, + }, + Format: "", + Value: "b", + }, + { '@type': "Num", + '@token': 0, + '@role': [Argument, Call, Expression, Function, Literal, Name, Number, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 498, + line: 19, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 499, + line: 19, + col: 32, + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 477, + line: 19, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 484, + line: 19, + col: 17, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 476, + line: 19, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 483, + line: 19, + col: 16, + }, + }, + Name: "request", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 484, + line: 19, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 488, + line: 19, + col: 21, + }, + }, + Name: "args", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 476, + line: 19, + col: 9, + }, + }, + Name: "get", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "type", + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 506, + line: 19, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 509, + line: 19, + col: 42, + }, + }, + Name: "int", + }, + }, + ], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 515, + line: 20, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 521, + line: 20, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 522, + line: 20, + col: 12, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 522, + line: 20, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 529, + line: 20, + col: 19, + }, + }, + Name: "jsonify", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "result", + }, + value: { '@type': "BinOp", + '@role': [Argument, Binary, Expression, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 537, + line: 20, + col: 27, + }, + }, + left: { '@type': "uast:Identifier", + '@role': [Binary, Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 537, + line: 20, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 538, + line: 20, + col: 28, + }, + }, + Name: "a", + }, + op: { '@type': "Add", + '@token': "+", + '@role': [Add, Arithmetic, Binary, Operator], + '@pos': { '@type': "uast:Positions", + }, + }, + right: { '@type': "uast:Identifier", + '@role': [Binary, Expression, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 541, + line: 20, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 542, + line: 20, + col: 32, + }, + }, + Name: "b", + }, + }, + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 546, + line: 23, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 579, + line: 25, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 585, + line: 25, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 586, + line: 25, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 602, + line: 25, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 614, + line: 25, + col: 40, + }, + }, + Format: "", + Value: "index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 586, + line: 25, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 601, + line: 25, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 617, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 619, + line: 27, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 648, + line: 28, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 648, + line: 28, + col: 5, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 649, + line: 28, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 652, + line: 28, + col: 9, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 648, + line: 28, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 651, + line: 28, + col: 8, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 648, + line: 28, + col: 5, + }, + }, + Name: "run", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 620, + line: 27, + col: 4, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 632, + line: 27, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 642, + line: 27, + col: 26, + }, + }, + Format: "", + Value: "__main__", + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 620, + line: 27, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 628, + line: 27, + col: 12, + }, + }, + Name: "__name__", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_62_src.uast b/uast/diff/testdata/testcase_62_src.uast new file mode 100644 index 00000000..da853933 --- /dev/null +++ b/uast/diff/testdata/testcase_62_src.uast @@ -0,0 +1,720 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 229, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 232, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n jQuery Example\n ~~~~~~~~~~~~~~\n\n A simple application that shows how Flask and jQuery get along.\n\n :copyright: (c) 2015 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 233, + line: 11, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 243, + line: 11, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 292, + line: 12, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 292, + line: 12, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 295, + line: 12, + col: 4, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 298, + line: 12, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 304, + line: 12, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 312, + line: 12, + col: 21, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 298, + line: 12, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 303, + line: 12, + col: 12, + }, + }, + Name: "Flask", + }, + keywords: [], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 316, + line: 15, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "add_numbers", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 367, + line: 17, + col: 5, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 367, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 424, + line: 17, + col: 62, + }, + }, + Format: "", + Value: "Add two numbers server side, ridiculous but well...", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 429, + line: 18, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 429, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 430, + line: 18, + col: 6, + }, + }, + Name: "a", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 433, + line: 18, + col: 9, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 450, + line: 18, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 453, + line: 18, + col: 29, + }, + }, + Format: "", + Value: "a", + }, + { '@type': "Num", + '@token': 0, + '@role': [Argument, Call, Expression, Function, Literal, Name, Number, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 455, + line: 18, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 456, + line: 18, + col: 32, + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 434, + line: 18, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 441, + line: 18, + col: 17, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 433, + line: 18, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 440, + line: 18, + col: 16, + }, + }, + Name: "request", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 441, + line: 18, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 445, + line: 18, + col: 21, + }, + }, + Name: "args", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 433, + line: 18, + col: 9, + }, + }, + Name: "get", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "type", + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 463, + line: 18, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 466, + line: 18, + col: 42, + }, + }, + Name: "int", + }, + }, + ], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 472, + line: 19, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 472, + line: 19, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 473, + line: 19, + col: 6, + }, + }, + Name: "b", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 476, + line: 19, + col: 9, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 493, + line: 19, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 496, + line: 19, + col: 29, + }, + }, + Format: "", + Value: "b", + }, + { '@type': "Num", + '@token': 0, + '@role': [Argument, Call, Expression, Function, Literal, Name, Number, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 498, + line: 19, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 499, + line: 19, + col: 32, + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 477, + line: 19, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 484, + line: 19, + col: 17, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 476, + line: 19, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 483, + line: 19, + col: 16, + }, + }, + Name: "request", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 484, + line: 19, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 488, + line: 19, + col: 21, + }, + }, + Name: "args", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 476, + line: 19, + col: 9, + }, + }, + Name: "get", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "type", + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 506, + line: 19, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 509, + line: 19, + col: 42, + }, + }, + Name: "int", + }, + }, + ], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 515, + line: 20, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 521, + line: 20, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 522, + line: 20, + col: 12, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 522, + line: 20, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 529, + line: 20, + col: 19, + }, + }, + Name: "jsonify", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "result", + }, + value: { '@type': "BinOp", + '@role': [Argument, Binary, Expression, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 537, + line: 20, + col: 27, + }, + }, + left: { '@type': "uast:Identifier", + '@role': [Binary, Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 537, + line: 20, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 538, + line: 20, + col: 28, + }, + }, + Name: "a", + }, + op: { '@type': "Add", + '@token': "+", + '@role': [Add, Arithmetic, Binary, Operator], + '@pos': { '@type': "uast:Positions", + }, + }, + right: { '@type': "uast:Identifier", + '@role': [Binary, Expression, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 541, + line: 20, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 542, + line: 20, + col: 32, + }, + }, + Name: "b", + }, + }, + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 546, + line: 23, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 579, + line: 25, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 585, + line: 25, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 586, + line: 25, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 602, + line: 25, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 614, + line: 25, + col: 40, + }, + }, + Format: "", + Value: "index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 586, + line: 25, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 601, + line: 25, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_63_dst.uast b/uast/diff/testdata/testcase_63_dst.uast new file mode 100644 index 00000000..09c48468 --- /dev/null +++ b/uast/diff/testdata/testcase_63_dst.uast @@ -0,0 +1,421 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 15, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 387, + line: 15, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 411, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 422, + line: 16, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 18, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 493, + line: 19, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 525, + line: 20, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 654, + line: 22, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 733, + line: 23, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 765, + line: 24, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.templating", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 872, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 874, + line: 27, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 895, + line: 28, + col: 5, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 875, + line: 27, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 889, + line: 27, + col: 18, + }, + }, + Name: "json_available", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_63_src.uast b/uast/diff/testdata/testcase_63_src.uast new file mode 100644 index 00000000..28866856 --- /dev/null +++ b/uast/diff/testdata/testcase_63_src.uast @@ -0,0 +1,363 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 15, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 387, + line: 15, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 411, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 422, + line: 16, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 18, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 493, + line: 19, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 525, + line: 20, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 660, + line: 22, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 739, + line: 23, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 771, + line: 24, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.templating", + }, + Target: ~, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_64_dst.uast b/uast/diff/testdata/testcase_64_dst.uast new file mode 100644 index 00000000..b4b1531b --- /dev/null +++ b/uast/diff/testdata/testcase_64_dst.uast @@ -0,0 +1,456 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 15, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 387, + line: 15, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 411, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 422, + line: 16, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 455, + line: 18, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 488, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 500, + line: 19, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 515, + line: 20, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 528, + line: 20, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 639, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 652, + line: 22, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 713, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 725, + line: 23, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 740, + line: 24, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 756, + line: 24, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 842, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 844, + line: 27, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 865, + line: 28, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 878, + line: 28, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 845, + line: 27, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 859, + line: 27, + col: 18, + }, + }, + Name: "json_available", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_64_src.uast b/uast/diff/testdata/testcase_64_src.uast new file mode 100644 index 00000000..09c48468 --- /dev/null +++ b/uast/diff/testdata/testcase_64_src.uast @@ -0,0 +1,421 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 15, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 387, + line: 15, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 411, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 422, + line: 16, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 18, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 493, + line: 19, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 525, + line: 20, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 654, + line: 22, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 733, + line: 23, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 765, + line: 24, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.templating", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 872, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 874, + line: 27, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 895, + line: 28, + col: 5, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 875, + line: 27, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 889, + line: 27, + col: 18, + }, + }, + Name: "json_available", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_65_dst.uast b/uast/diff/testdata/testcase_65_dst.uast new file mode 100644 index 00000000..9145c39e --- /dev/null +++ b/uast/diff/testdata/testcase_65_dst.uast @@ -0,0 +1,464 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 15, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 387, + line: 15, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 411, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 422, + line: 16, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 455, + line: 18, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 488, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 500, + line: 19, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 515, + line: 20, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 528, + line: 20, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 666, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 679, + line: 23, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 740, + line: 24, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 752, + line: 24, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 767, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 783, + line: 25, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 869, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 871, + line: 28, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 892, + line: 29, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 905, + line: 29, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 872, + line: 28, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 886, + line: 28, + col: 18, + }, + }, + Name: "json_available", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_65_src.uast b/uast/diff/testdata/testcase_65_src.uast new file mode 100644 index 00000000..b4b1531b --- /dev/null +++ b/uast/diff/testdata/testcase_65_src.uast @@ -0,0 +1,456 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 15, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 387, + line: 15, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 411, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 422, + line: 16, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 455, + line: 18, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 488, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 500, + line: 19, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 515, + line: 20, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 528, + line: 20, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 639, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 652, + line: 22, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 713, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 725, + line: 23, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 740, + line: 24, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 756, + line: 24, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 842, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 844, + line: 27, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 865, + line: 28, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 878, + line: 28, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 845, + line: 27, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 859, + line: 27, + col: 18, + }, + }, + Name: "json_available", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_66_dst.uast b/uast/diff/testdata/testcase_66_dst.uast new file mode 100644 index 00000000..20208574 --- /dev/null +++ b/uast/diff/testdata/testcase_66_dst.uast @@ -0,0 +1,992 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 246, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 249, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask.globals\n ~~~~~~~~~~~~~\n\n Defines all the global objects that are proxies to the current\n active context.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 251, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 265, + line: 13, + col: 15, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "partial", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "functools", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 281, + line: 14, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "LocalStack", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "LocalProxy", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.local", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 336, + line: 16, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 350, + line: 16, + col: 19, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_lookup_object", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 362, + line: 17, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 362, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 365, + line: 17, + col: 8, + }, + }, + Name: "top", + }, + ], + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 369, + line: 17, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 387, + line: 17, + col: 30, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 368, + line: 17, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 386, + line: 17, + col: 29, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 368, + line: 17, + col: 11, + }, + }, + Name: "top", + }, + ], + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 395, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 397, + line: 18, + col: 7, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Raise", + '@token': "raise", + '@role': [Statement, Throw], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 419, + line: 19, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 424, + line: 19, + col: 14, + }, + }, + cause: ~, + exc: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 425, + line: 19, + col: 15, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 438, + line: 19, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 474, + line: 19, + col: 64, + }, + }, + Format: "", + Value: "working outside of request context", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 425, + line: 19, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 437, + line: 19, + col: 27, + }, + }, + Name: "RuntimeError", + }, + keywords: [], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 398, + line: 18, + col: 8, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 405, + line: 18, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 409, + line: 18, + col: 19, + }, + }, + LiteralValue: "None", + value: ~, + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 398, + line: 18, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 401, + line: 18, + col: 11, + }, + }, + Name: "top", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Is", + '@token': "is", + '@role': [Identical, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 480, + line: 20, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 486, + line: 20, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 487, + line: 20, + col: 12, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 495, + line: 20, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 498, + line: 20, + col: 23, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 500, + line: 20, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 504, + line: 20, + col: 29, + }, + }, + Name: "name", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 487, + line: 20, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 494, + line: 20, + col: 19, + }, + }, + Name: "getattr", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 351, + line: 16, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 355, + line: 16, + col: 24, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 351, + line: 16, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 355, + line: 16, + col: 24, + }, + }, + Name: "name", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 525, + line: 24, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 525, + line: 24, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 543, + line: 24, + col: 19, + }, + }, + Name: "_request_ctx_stack", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 546, + line: 24, + col: 22, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 546, + line: 24, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 556, + line: 24, + col: 32, + }, + }, + Name: "LocalStack", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 559, + line: 25, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 559, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 570, + line: 25, + col: 12, + }, + }, + Name: "current_app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 573, + line: 25, + col: 15, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 584, + line: 25, + col: 26, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 592, + line: 25, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 606, + line: 25, + col: 48, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 608, + line: 25, + col: 50, + }, + end: { '@type': "uast:Position", + offset: 613, + line: 25, + col: 55, + }, + }, + Format: "", + Value: "app", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 584, + line: 25, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 591, + line: 25, + col: 33, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 573, + line: 25, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 583, + line: 25, + col: 25, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 616, + line: 26, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 616, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 623, + line: 26, + col: 8, + }, + }, + Name: "request", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 626, + line: 26, + col: 11, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 637, + line: 26, + col: 22, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 645, + line: 26, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 659, + line: 26, + col: 44, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 661, + line: 26, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 670, + line: 26, + col: 55, + }, + }, + Format: "", + Value: "request", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 637, + line: 26, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 644, + line: 26, + col: 29, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 626, + line: 26, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 636, + line: 26, + col: 21, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 673, + line: 27, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 673, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 680, + line: 27, + col: 8, + }, + }, + Name: "session", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 683, + line: 27, + col: 11, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 694, + line: 27, + col: 22, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 702, + line: 27, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 716, + line: 27, + col: 44, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 718, + line: 27, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 727, + line: 27, + col: 55, + }, + }, + Format: "", + Value: "session", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 694, + line: 27, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 701, + line: 27, + col: 29, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 683, + line: 27, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 693, + line: 27, + col: 21, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 730, + line: 28, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 730, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 731, + line: 28, + col: 2, + }, + }, + Name: "g", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 734, + line: 28, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 745, + line: 28, + col: 16, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 753, + line: 28, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 767, + line: 28, + col: 38, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 769, + line: 28, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 772, + line: 28, + col: 43, + }, + }, + Format: "", + Value: "g", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 745, + line: 28, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 752, + line: 28, + col: 23, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 734, + line: 28, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 744, + line: 28, + col: 15, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_66_src.uast b/uast/diff/testdata/testcase_66_src.uast new file mode 100644 index 00000000..4d9f3719 --- /dev/null +++ b/uast/diff/testdata/testcase_66_src.uast @@ -0,0 +1,992 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 246, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 249, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask.globals\n ~~~~~~~~~~~~~\n\n Defines all the global objects that are proxies to the current\n active context.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 251, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 265, + line: 13, + col: 15, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "partial", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "functools", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 281, + line: 14, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "LocalStack", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "LocalProxy", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.local", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 336, + line: 16, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 350, + line: 16, + col: 19, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_lookup_object", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 362, + line: 17, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 362, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 365, + line: 17, + col: 8, + }, + }, + Name: "top", + }, + ], + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 369, + line: 17, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 387, + line: 17, + col: 30, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 368, + line: 17, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 386, + line: 17, + col: 29, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 368, + line: 17, + col: 11, + }, + }, + Name: "top", + }, + ], + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 395, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 397, + line: 18, + col: 7, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Raise", + '@token': "raise", + '@role': [Statement, Throw], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 419, + line: 19, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 424, + line: 19, + col: 14, + }, + }, + cause: ~, + exc: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 425, + line: 19, + col: 15, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 438, + line: 19, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 474, + line: 19, + col: 64, + }, + }, + Format: "", + Value: "working outside of request context", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 425, + line: 19, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 437, + line: 19, + col: 27, + }, + }, + Name: "RuntimeError", + }, + keywords: [], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 398, + line: 18, + col: 8, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 405, + line: 18, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 409, + line: 18, + col: 19, + }, + }, + LiteralValue: "None", + value: ~, + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 398, + line: 18, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 401, + line: 18, + col: 11, + }, + }, + Name: "top", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Is", + '@token': "is", + '@role': [Identical, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 480, + line: 20, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 486, + line: 20, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 487, + line: 20, + col: 12, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 495, + line: 20, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 498, + line: 20, + col: 23, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 500, + line: 20, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 504, + line: 20, + col: 29, + }, + }, + Name: "name", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 487, + line: 20, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 494, + line: 20, + col: 19, + }, + }, + Name: "getattr", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 351, + line: 16, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 355, + line: 16, + col: 24, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 351, + line: 16, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 355, + line: 16, + col: 24, + }, + }, + Name: "name", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 524, + line: 23, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 524, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 542, + line: 23, + col: 19, + }, + }, + Name: "_request_ctx_stack", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 545, + line: 23, + col: 22, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 545, + line: 23, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 555, + line: 23, + col: 32, + }, + }, + Name: "LocalStack", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 558, + line: 24, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 558, + line: 24, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 569, + line: 24, + col: 12, + }, + }, + Name: "current_app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 572, + line: 24, + col: 15, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 583, + line: 24, + col: 26, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 591, + line: 24, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 605, + line: 24, + col: 48, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 607, + line: 24, + col: 50, + }, + end: { '@type': "uast:Position", + offset: 612, + line: 24, + col: 55, + }, + }, + Format: "", + Value: "app", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 583, + line: 24, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 590, + line: 24, + col: 33, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 572, + line: 24, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 582, + line: 24, + col: 25, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 615, + line: 25, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 615, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 622, + line: 25, + col: 8, + }, + }, + Name: "request", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 625, + line: 25, + col: 11, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 636, + line: 25, + col: 22, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 644, + line: 25, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 658, + line: 25, + col: 44, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 660, + line: 25, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 669, + line: 25, + col: 55, + }, + }, + Format: "", + Value: "request", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 636, + line: 25, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 643, + line: 25, + col: 29, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 625, + line: 25, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 635, + line: 25, + col: 21, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 672, + line: 26, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 672, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 679, + line: 26, + col: 8, + }, + }, + Name: "session", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 682, + line: 26, + col: 11, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 693, + line: 26, + col: 22, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 701, + line: 26, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 715, + line: 26, + col: 44, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 717, + line: 26, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 726, + line: 26, + col: 55, + }, + }, + Format: "", + Value: "session", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 693, + line: 26, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 700, + line: 26, + col: 29, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 682, + line: 26, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 692, + line: 26, + col: 21, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 729, + line: 27, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 729, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 730, + line: 27, + col: 2, + }, + }, + Name: "g", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 733, + line: 27, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 744, + line: 27, + col: 16, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 752, + line: 27, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 766, + line: 27, + col: 38, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 768, + line: 27, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 771, + line: 27, + col: 43, + }, + }, + Format: "", + Value: "g", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 744, + line: 27, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 751, + line: 27, + col: 23, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 733, + line: 27, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 743, + line: 27, + col: 15, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_67_dst.uast b/uast/diff/testdata/testcase_67_dst.uast new file mode 100644 index 00000000..f910c3f9 --- /dev/null +++ b/uast/diff/testdata/testcase_67_dst.uast @@ -0,0 +1,1315 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 246, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 249, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask.globals\n ~~~~~~~~~~~~~\n\n Defines all the global objects that are proxies to the current\n active context.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 251, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 265, + line: 13, + col: 15, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "partial", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "functools", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 281, + line: 14, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "LocalStack", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "LocalProxy", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.local", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 336, + line: 16, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 350, + line: 16, + col: 19, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_lookup_object", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 362, + line: 17, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 362, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 365, + line: 17, + col: 8, + }, + }, + Name: "top", + }, + ], + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 369, + line: 17, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 387, + line: 17, + col: 30, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 368, + line: 17, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 386, + line: 17, + col: 29, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 368, + line: 17, + col: 11, + }, + }, + Name: "top", + }, + ], + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 395, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 397, + line: 18, + col: 7, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Raise", + '@token': "raise", + '@role': [Statement, Throw], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 419, + line: 19, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 424, + line: 19, + col: 14, + }, + }, + cause: ~, + exc: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 425, + line: 19, + col: 15, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 438, + line: 19, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 474, + line: 19, + col: 64, + }, + }, + Format: "", + Value: "working outside of request context", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 425, + line: 19, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 437, + line: 19, + col: 27, + }, + }, + Name: "RuntimeError", + }, + keywords: [], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 398, + line: 18, + col: 8, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 405, + line: 18, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 409, + line: 18, + col: 19, + }, + }, + LiteralValue: "None", + value: ~, + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 398, + line: 18, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 401, + line: 18, + col: 11, + }, + }, + Name: "top", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Is", + '@token': "is", + '@role': [Identical, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 480, + line: 20, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 486, + line: 20, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 487, + line: 20, + col: 12, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 495, + line: 20, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 498, + line: 20, + col: 23, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 500, + line: 20, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 504, + line: 20, + col: 29, + }, + }, + Name: "name", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 487, + line: 20, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 494, + line: 20, + col: 19, + }, + }, + Name: "getattr", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 351, + line: 16, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 355, + line: 16, + col: 24, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 351, + line: 16, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 355, + line: 16, + col: 24, + }, + }, + Name: "name", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 512, + line: 23, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 521, + line: 23, + col: 14, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_find_app", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 529, + line: 24, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 529, + line: 24, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 532, + line: 24, + col: 8, + }, + }, + Name: "top", + }, + ], + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 536, + line: 24, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 550, + line: 24, + col: 26, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 535, + line: 24, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 549, + line: 24, + col: 25, + }, + }, + Name: "_app_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 535, + line: 24, + col: 11, + }, + }, + Name: "top", + }, + ], + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 558, + line: 25, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 560, + line: 25, + col: 7, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Raise", + '@token': "raise", + '@role': [Statement, Throw], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 582, + line: 26, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 587, + line: 26, + col: 14, + }, + }, + cause: ~, + exc: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 588, + line: 26, + col: 15, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 601, + line: 26, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 641, + line: 26, + col: 68, + }, + }, + Format: "", + Value: "working outside of application context", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 588, + line: 26, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 600, + line: 26, + col: 27, + }, + }, + Name: "RuntimeError", + }, + keywords: [], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 561, + line: 25, + col: 8, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 568, + line: 25, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 572, + line: 25, + col: 19, + }, + }, + LiteralValue: "None", + value: ~, + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 561, + line: 25, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 564, + line: 25, + col: 11, + }, + }, + Name: "top", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Is", + '@token': "is", + '@role': [Identical, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 647, + line: 27, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 653, + line: 27, + col: 11, + }, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 655, + line: 27, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 658, + line: 27, + col: 16, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 654, + line: 27, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 657, + line: 27, + col: 15, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 654, + line: 27, + col: 12, + }, + }, + Name: "app", + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 681, + line: 31, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 681, + line: 31, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 699, + line: 31, + col: 19, + }, + }, + Name: "_request_ctx_stack", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 702, + line: 31, + col: 22, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 702, + line: 31, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 712, + line: 31, + col: 32, + }, + }, + Name: "LocalStack", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 715, + line: 32, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 715, + line: 32, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 729, + line: 32, + col: 15, + }, + }, + Name: "_app_ctx_stack", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 732, + line: 32, + col: 18, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 732, + line: 32, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 742, + line: 32, + col: 28, + }, + }, + Name: "LocalStack", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 745, + line: 33, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 745, + line: 33, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 756, + line: 33, + col: 12, + }, + }, + Name: "current_app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 759, + line: 33, + col: 15, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 770, + line: 33, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 779, + line: 33, + col: 35, + }, + }, + Name: "_find_app", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 759, + line: 33, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 769, + line: 33, + col: 25, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 781, + line: 34, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 781, + line: 34, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 788, + line: 34, + col: 8, + }, + }, + Name: "request", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 791, + line: 34, + col: 11, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 802, + line: 34, + col: 22, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 810, + line: 34, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 824, + line: 34, + col: 44, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 826, + line: 34, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 835, + line: 34, + col: 55, + }, + }, + Format: "", + Value: "request", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 802, + line: 34, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 809, + line: 34, + col: 29, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 791, + line: 34, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 801, + line: 34, + col: 21, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 838, + line: 35, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 838, + line: 35, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 845, + line: 35, + col: 8, + }, + }, + Name: "session", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 848, + line: 35, + col: 11, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 859, + line: 35, + col: 22, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 867, + line: 35, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 881, + line: 35, + col: 44, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 883, + line: 35, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 892, + line: 35, + col: 55, + }, + }, + Format: "", + Value: "session", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 859, + line: 35, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 866, + line: 35, + col: 29, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 848, + line: 35, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 858, + line: 35, + col: 21, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 895, + line: 36, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 895, + line: 36, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 896, + line: 36, + col: 2, + }, + }, + Name: "g", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 899, + line: 36, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 910, + line: 36, + col: 16, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 918, + line: 36, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 932, + line: 36, + col: 38, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 934, + line: 36, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 937, + line: 36, + col: 43, + }, + }, + Format: "", + Value: "g", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 910, + line: 36, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 917, + line: 36, + col: 23, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 899, + line: 36, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 909, + line: 36, + col: 15, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_67_src.uast b/uast/diff/testdata/testcase_67_src.uast new file mode 100644 index 00000000..20208574 --- /dev/null +++ b/uast/diff/testdata/testcase_67_src.uast @@ -0,0 +1,992 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 246, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 249, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask.globals\n ~~~~~~~~~~~~~\n\n Defines all the global objects that are proxies to the current\n active context.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 251, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 265, + line: 13, + col: 15, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "partial", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "functools", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 281, + line: 14, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "LocalStack", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "LocalProxy", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.local", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 336, + line: 16, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 350, + line: 16, + col: 19, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_lookup_object", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 362, + line: 17, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 362, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 365, + line: 17, + col: 8, + }, + }, + Name: "top", + }, + ], + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 369, + line: 17, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 387, + line: 17, + col: 30, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 368, + line: 17, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 386, + line: 17, + col: 29, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 368, + line: 17, + col: 11, + }, + }, + Name: "top", + }, + ], + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 395, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 397, + line: 18, + col: 7, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Raise", + '@token': "raise", + '@role': [Statement, Throw], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 419, + line: 19, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 424, + line: 19, + col: 14, + }, + }, + cause: ~, + exc: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 425, + line: 19, + col: 15, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 438, + line: 19, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 474, + line: 19, + col: 64, + }, + }, + Format: "", + Value: "working outside of request context", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 425, + line: 19, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 437, + line: 19, + col: 27, + }, + }, + Name: "RuntimeError", + }, + keywords: [], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 398, + line: 18, + col: 8, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 405, + line: 18, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 409, + line: 18, + col: 19, + }, + }, + LiteralValue: "None", + value: ~, + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 398, + line: 18, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 401, + line: 18, + col: 11, + }, + }, + Name: "top", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Is", + '@token': "is", + '@role': [Identical, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 480, + line: 20, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 486, + line: 20, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 487, + line: 20, + col: 12, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 495, + line: 20, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 498, + line: 20, + col: 23, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 500, + line: 20, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 504, + line: 20, + col: 29, + }, + }, + Name: "name", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 487, + line: 20, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 494, + line: 20, + col: 19, + }, + }, + Name: "getattr", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 351, + line: 16, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 355, + line: 16, + col: 24, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 351, + line: 16, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 355, + line: 16, + col: 24, + }, + }, + Name: "name", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 525, + line: 24, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 525, + line: 24, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 543, + line: 24, + col: 19, + }, + }, + Name: "_request_ctx_stack", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 546, + line: 24, + col: 22, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 546, + line: 24, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 556, + line: 24, + col: 32, + }, + }, + Name: "LocalStack", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 559, + line: 25, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 559, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 570, + line: 25, + col: 12, + }, + }, + Name: "current_app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 573, + line: 25, + col: 15, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 584, + line: 25, + col: 26, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 592, + line: 25, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 606, + line: 25, + col: 48, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 608, + line: 25, + col: 50, + }, + end: { '@type': "uast:Position", + offset: 613, + line: 25, + col: 55, + }, + }, + Format: "", + Value: "app", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 584, + line: 25, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 591, + line: 25, + col: 33, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 573, + line: 25, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 583, + line: 25, + col: 25, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 616, + line: 26, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 616, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 623, + line: 26, + col: 8, + }, + }, + Name: "request", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 626, + line: 26, + col: 11, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 637, + line: 26, + col: 22, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 645, + line: 26, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 659, + line: 26, + col: 44, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 661, + line: 26, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 670, + line: 26, + col: 55, + }, + }, + Format: "", + Value: "request", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 637, + line: 26, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 644, + line: 26, + col: 29, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 626, + line: 26, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 636, + line: 26, + col: 21, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 673, + line: 27, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 673, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 680, + line: 27, + col: 8, + }, + }, + Name: "session", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 683, + line: 27, + col: 11, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 694, + line: 27, + col: 22, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 702, + line: 27, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 716, + line: 27, + col: 44, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 718, + line: 27, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 727, + line: 27, + col: 55, + }, + }, + Format: "", + Value: "session", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 694, + line: 27, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 701, + line: 27, + col: 29, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 683, + line: 27, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 693, + line: 27, + col: 21, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 730, + line: 28, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 730, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 731, + line: 28, + col: 2, + }, + }, + Name: "g", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 734, + line: 28, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 745, + line: 28, + col: 16, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 753, + line: 28, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 767, + line: 28, + col: 38, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 769, + line: 28, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 772, + line: 28, + col: 43, + }, + }, + Format: "", + Value: "g", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 745, + line: 28, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 752, + line: 28, + col: 23, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 734, + line: 28, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 744, + line: 28, + col: 15, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_68_dst.uast b/uast/diff/testdata/testcase_68_dst.uast new file mode 100644 index 00000000..0bae8e2f --- /dev/null +++ b/uast/diff/testdata/testcase_68_dst.uast @@ -0,0 +1,350 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 664, + line: 19, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 667, + line: 19, + col: 4, + }, + }, + Format: "", + Value: "\n flask.ext\n ~~~~~~~~~\n\n Redirect imports for extensions. This module basically makes it possible\n for us to transition from flaskext.foo to flask_foo without having to\n force all extensions to upgrade at the same time.\n\n When a user does ``from flask.ext.foo import bar`` it will attempt to\n import ``from flask_foo import bar`` first and when that fails it will\n try to import ``from flaskext.foo import bar``.\n\n We're switching from namespace packages because it was just too painful for\n everybody involved.\n\n :copyright: (c) 2014 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 674, + line: 22, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 679, + line: 22, + col: 10, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "setup", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 687, + line: 23, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 701, + line: 23, + col: 19, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "ExtensionImporter", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../../exthook", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 731, + line: 24, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 731, + line: 24, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 739, + line: 24, + col: 13, + }, + }, + Name: "importer", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 742, + line: 24, + col: 16, + }, + }, + args: [ + { '@type': "List", + '@role': [Argument, Call, Expression, Function, List, Literal, Name, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 760, + line: 24, + col: 34, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 761, + line: 24, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 771, + line: 24, + col: 45, + }, + }, + Format: "", + Value: "flask_%s", + }, + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 773, + line: 24, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 786, + line: 24, + col: 60, + }, + }, + Format: "", + Value: "flaskext.%s", + }, + ], + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 789, + line: 24, + col: 63, + }, + end: { '@type': "uast:Position", + offset: 797, + line: 24, + col: 71, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 742, + line: 24, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 759, + line: 24, + col: 33, + }, + }, + Name: "ExtensionImporter", + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 803, + line: 25, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 803, + line: 25, + col: 5, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 804, + line: 25, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 812, + line: 25, + col: 14, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 803, + line: 25, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 811, + line: 25, + col: 13, + }, + }, + Name: "importer", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 803, + line: 25, + col: 5, + }, + }, + Name: "install", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 824, + line: 28, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 824, + line: 28, + col: 1, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 824, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 829, + line: 28, + col: 6, + }, + }, + Name: "setup", + }, + keywords: [], + }, + }, + { '@type': "Delete", + '@token': "del", + '@role': [Incomplete, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 832, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 835, + line: 29, + col: 4, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 836, + line: 29, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 841, + line: 29, + col: 10, + }, + }, + Name: "setup", + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_68_src.uast b/uast/diff/testdata/testcase_68_src.uast new file mode 100644 index 00000000..ad237dd4 --- /dev/null +++ b/uast/diff/testdata/testcase_68_src.uast @@ -0,0 +1,350 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 664, + line: 19, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 667, + line: 19, + col: 4, + }, + }, + Format: "", + Value: "\n flask.ext\n ~~~~~~~~~\n\n Redirect imports for extensions. This module basically makes it possible\n for us to transition from flaskext.foo to flask_foo without having to\n force all extensions to upgrade at the same time.\n\n When a user does ``from flask.ext.foo import bar`` it will attempt to\n import ``from flask_foo import bar`` first and when that fails it will\n try to import ``from flaskext.foo import bar``.\n\n We're switching from namespace packages because it was just too painful for\n everybody involved.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 674, + line: 22, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 679, + line: 22, + col: 10, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "setup", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 687, + line: 23, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 701, + line: 23, + col: 19, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "ExtensionImporter", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../../exthook", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 731, + line: 24, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 731, + line: 24, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 739, + line: 24, + col: 13, + }, + }, + Name: "importer", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 742, + line: 24, + col: 16, + }, + }, + args: [ + { '@type': "List", + '@role': [Argument, Call, Expression, Function, List, Literal, Name, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 760, + line: 24, + col: 34, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 761, + line: 24, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 771, + line: 24, + col: 45, + }, + }, + Format: "", + Value: "flask_%s", + }, + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 773, + line: 24, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 786, + line: 24, + col: 60, + }, + }, + Format: "", + Value: "flaskext.%s", + }, + ], + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 789, + line: 24, + col: 63, + }, + end: { '@type': "uast:Position", + offset: 797, + line: 24, + col: 71, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 742, + line: 24, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 759, + line: 24, + col: 33, + }, + }, + Name: "ExtensionImporter", + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 803, + line: 25, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 803, + line: 25, + col: 5, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 804, + line: 25, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 812, + line: 25, + col: 14, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 803, + line: 25, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 811, + line: 25, + col: 13, + }, + }, + Name: "importer", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 803, + line: 25, + col: 5, + }, + }, + Name: "install", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 824, + line: 28, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 824, + line: 28, + col: 1, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 824, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 829, + line: 28, + col: 6, + }, + }, + Name: "setup", + }, + keywords: [], + }, + }, + { '@type': "Delete", + '@token': "del", + '@role': [Incomplete, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 832, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 835, + line: 29, + col: 4, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 836, + line: 29, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 841, + line: 29, + col: 10, + }, + }, + Name: "setup", + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_69_dst.uast b/uast/diff/testdata/testcase_69_dst.uast new file mode 100644 index 00000000..39658041 --- /dev/null +++ b/uast/diff/testdata/testcase_69_dst.uast @@ -0,0 +1,869 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 229, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 232, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n jQuery Example\n ~~~~~~~~~~~~~~\n\n A simple application that shows how Flask and jQuery get along.\n\n :copyright: (c) 2014 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 233, + line: 11, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 243, + line: 11, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 292, + line: 12, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 292, + line: 12, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 295, + line: 12, + col: 4, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 298, + line: 12, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 304, + line: 12, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 312, + line: 12, + col: 21, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 298, + line: 12, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 303, + line: 12, + col: 12, + }, + }, + Name: "Flask", + }, + keywords: [], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 316, + line: 15, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "add_numbers", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 367, + line: 17, + col: 5, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 367, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 424, + line: 17, + col: 62, + }, + }, + Format: "", + Value: "Add two numbers server side, ridiculous but well...", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 429, + line: 18, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 429, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 430, + line: 18, + col: 6, + }, + }, + Name: "a", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 433, + line: 18, + col: 9, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 450, + line: 18, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 453, + line: 18, + col: 29, + }, + }, + Format: "", + Value: "a", + }, + { '@type': "Num", + '@token': 0, + '@role': [Argument, Call, Expression, Function, Literal, Name, Number, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 455, + line: 18, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 456, + line: 18, + col: 32, + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 434, + line: 18, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 441, + line: 18, + col: 17, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 433, + line: 18, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 440, + line: 18, + col: 16, + }, + }, + Name: "request", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 441, + line: 18, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 445, + line: 18, + col: 21, + }, + }, + Name: "args", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 433, + line: 18, + col: 9, + }, + }, + Name: "get", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "type", + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 463, + line: 18, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 466, + line: 18, + col: 42, + }, + }, + Name: "int", + }, + }, + ], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 472, + line: 19, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 472, + line: 19, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 473, + line: 19, + col: 6, + }, + }, + Name: "b", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 476, + line: 19, + col: 9, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 493, + line: 19, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 496, + line: 19, + col: 29, + }, + }, + Format: "", + Value: "b", + }, + { '@type': "Num", + '@token': 0, + '@role': [Argument, Call, Expression, Function, Literal, Name, Number, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 498, + line: 19, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 499, + line: 19, + col: 32, + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 477, + line: 19, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 484, + line: 19, + col: 17, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 476, + line: 19, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 483, + line: 19, + col: 16, + }, + }, + Name: "request", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 484, + line: 19, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 488, + line: 19, + col: 21, + }, + }, + Name: "args", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 476, + line: 19, + col: 9, + }, + }, + Name: "get", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "type", + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 506, + line: 19, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 509, + line: 19, + col: 42, + }, + }, + Name: "int", + }, + }, + ], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 515, + line: 20, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 521, + line: 20, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 522, + line: 20, + col: 12, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 522, + line: 20, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 529, + line: 20, + col: 19, + }, + }, + Name: "jsonify", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "result", + }, + value: { '@type': "BinOp", + '@role': [Argument, Binary, Expression, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 537, + line: 20, + col: 27, + }, + }, + left: { '@type': "uast:Identifier", + '@role': [Binary, Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 537, + line: 20, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 538, + line: 20, + col: 28, + }, + }, + Name: "a", + }, + op: { '@type': "Add", + '@token': "+", + '@role': [Add, Arithmetic, Binary, Operator], + '@pos': { '@type': "uast:Positions", + }, + }, + right: { '@type': "uast:Identifier", + '@role': [Binary, Expression, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 541, + line: 20, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 542, + line: 20, + col: 32, + }, + }, + Name: "b", + }, + }, + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 546, + line: 23, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 579, + line: 25, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 585, + line: 25, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 586, + line: 25, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 602, + line: 25, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 614, + line: 25, + col: 40, + }, + }, + Format: "", + Value: "index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 586, + line: 25, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 601, + line: 25, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 618, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 620, + line: 28, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 649, + line: 29, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 649, + line: 29, + col: 5, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 650, + line: 29, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 653, + line: 29, + col: 9, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 649, + line: 29, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 652, + line: 29, + col: 8, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 649, + line: 29, + col: 5, + }, + }, + Name: "run", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 621, + line: 28, + col: 4, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 633, + line: 28, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 643, + line: 28, + col: 26, + }, + }, + Format: "", + Value: "__main__", + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 621, + line: 28, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 629, + line: 28, + col: 12, + }, + }, + Name: "__name__", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_69_src.uast b/uast/diff/testdata/testcase_69_src.uast new file mode 100644 index 00000000..28acd733 --- /dev/null +++ b/uast/diff/testdata/testcase_69_src.uast @@ -0,0 +1,869 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 229, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 232, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n jQuery Example\n ~~~~~~~~~~~~~~\n\n A simple application that shows how Flask and jQuery get along.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 233, + line: 11, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 243, + line: 11, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 292, + line: 12, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 292, + line: 12, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 295, + line: 12, + col: 4, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 298, + line: 12, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 304, + line: 12, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 312, + line: 12, + col: 21, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 298, + line: 12, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 303, + line: 12, + col: 12, + }, + }, + Name: "Flask", + }, + keywords: [], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 316, + line: 15, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "add_numbers", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 367, + line: 17, + col: 5, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 367, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 424, + line: 17, + col: 62, + }, + }, + Format: "", + Value: "Add two numbers server side, ridiculous but well...", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 429, + line: 18, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 429, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 430, + line: 18, + col: 6, + }, + }, + Name: "a", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 433, + line: 18, + col: 9, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 450, + line: 18, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 453, + line: 18, + col: 29, + }, + }, + Format: "", + Value: "a", + }, + { '@type': "Num", + '@token': 0, + '@role': [Argument, Call, Expression, Function, Literal, Name, Number, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 455, + line: 18, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 456, + line: 18, + col: 32, + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 434, + line: 18, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 441, + line: 18, + col: 17, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 433, + line: 18, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 440, + line: 18, + col: 16, + }, + }, + Name: "request", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 441, + line: 18, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 445, + line: 18, + col: 21, + }, + }, + Name: "args", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 433, + line: 18, + col: 9, + }, + }, + Name: "get", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "type", + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 463, + line: 18, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 466, + line: 18, + col: 42, + }, + }, + Name: "int", + }, + }, + ], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 472, + line: 19, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 472, + line: 19, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 473, + line: 19, + col: 6, + }, + }, + Name: "b", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 476, + line: 19, + col: 9, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 493, + line: 19, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 496, + line: 19, + col: 29, + }, + }, + Format: "", + Value: "b", + }, + { '@type': "Num", + '@token': 0, + '@role': [Argument, Call, Expression, Function, Literal, Name, Number, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 498, + line: 19, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 499, + line: 19, + col: 32, + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 477, + line: 19, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 484, + line: 19, + col: 17, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 476, + line: 19, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 483, + line: 19, + col: 16, + }, + }, + Name: "request", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 484, + line: 19, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 488, + line: 19, + col: 21, + }, + }, + Name: "args", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 476, + line: 19, + col: 9, + }, + }, + Name: "get", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "type", + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 506, + line: 19, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 509, + line: 19, + col: 42, + }, + }, + Name: "int", + }, + }, + ], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 515, + line: 20, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 521, + line: 20, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 522, + line: 20, + col: 12, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 522, + line: 20, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 529, + line: 20, + col: 19, + }, + }, + Name: "jsonify", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "result", + }, + value: { '@type': "BinOp", + '@role': [Argument, Binary, Expression, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 537, + line: 20, + col: 27, + }, + }, + left: { '@type': "uast:Identifier", + '@role': [Binary, Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 537, + line: 20, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 538, + line: 20, + col: 28, + }, + }, + Name: "a", + }, + op: { '@type': "Add", + '@token': "+", + '@role': [Add, Arithmetic, Binary, Operator], + '@pos': { '@type': "uast:Positions", + }, + }, + right: { '@type': "uast:Identifier", + '@role': [Binary, Expression, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 541, + line: 20, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 542, + line: 20, + col: 32, + }, + }, + Name: "b", + }, + }, + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 546, + line: 23, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 579, + line: 25, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 585, + line: 25, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 586, + line: 25, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 602, + line: 25, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 614, + line: 25, + col: 40, + }, + }, + Format: "", + Value: "index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 586, + line: 25, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 601, + line: 25, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 618, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 620, + line: 28, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 649, + line: 29, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 649, + line: 29, + col: 5, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 650, + line: 29, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 653, + line: 29, + col: 9, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 649, + line: 29, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 652, + line: 29, + col: 8, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 649, + line: 29, + col: 5, + }, + }, + Name: "run", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 621, + line: 28, + col: 4, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 633, + line: 28, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 643, + line: 28, + col: 26, + }, + }, + Format: "", + Value: "__main__", + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 621, + line: 28, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 629, + line: 28, + col: 12, + }, + }, + Name: "__name__", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_6_dst.uast b/uast/diff/testdata/testcase_6_dst.uast new file mode 100644 index 00000000..8275baeb --- /dev/null +++ b/uast/diff/testdata/testcase_6_dst.uast @@ -0,0 +1,398 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 22, + line: 2, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "sys", + }, + Node: {}, + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "os", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 20, + line: 1, + col: 21, + }, + }, + lines: [ + { '@type': "uast:Comment", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + }, + Block: false, + Prefix: "!/", + Suffix: "\n", + Tab: "", + Text: "usr/bin/env python", + }, + ], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 37, + line: 3, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 37, + line: 3, + col: 1, + }, + }, + args: [ + { '@type': "Num", + '@token': 0, + '@role': [Argument, Call, Expression, Function, Literal, Name, Number, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 53, + line: 3, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 54, + line: 3, + col: 18, + }, + }, + }, + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 56, + line: 3, + col: 20, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 72, + line: 3, + col: 36, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 88, + line: 3, + col: 52, + }, + end: { '@type': "uast:Position", + offset: 96, + line: 3, + col: 60, + }, + }, + Name: "__file__", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 73, + line: 3, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 75, + line: 3, + col: 39, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 72, + line: 3, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 74, + line: 3, + col: 38, + }, + }, + Name: "os", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 75, + line: 3, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 79, + line: 3, + col: 43, + }, + }, + Name: "path", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 72, + line: 3, + col: 36, + }, + }, + Name: "dirname", + }, + ], + }, + keywords: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 3, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 59, + line: 3, + col: 23, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 56, + line: 3, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 58, + line: 3, + col: 22, + }, + }, + Name: "os", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 59, + line: 3, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 63, + line: 3, + col: 27, + }, + }, + Name: "path", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 56, + line: 3, + col: 20, + }, + }, + Name: "abspath", + }, + ], + }, + keywords: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 38, + line: 3, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 41, + line: 3, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 37, + line: 3, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 40, + line: 3, + col: 4, + }, + }, + Name: "sys", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 41, + line: 3, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 45, + line: 3, + col: 9, + }, + }, + Name: "path", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 37, + line: 3, + col: 1, + }, + }, + Name: "insert", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 100, + line: 4, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "main", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.testsuite", + }, + Target: ~, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 133, + line: 5, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 133, + line: 5, + col: 1, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 133, + line: 5, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 137, + line: 5, + col: 5, + }, + }, + Name: "main", + }, + keywords: [], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_6_src.uast b/uast/diff/testdata/testcase_6_src.uast new file mode 100644 index 00000000..4c15dc9b --- /dev/null +++ b/uast/diff/testdata/testcase_6_src.uast @@ -0,0 +1,69 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 22, + line: 2, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "main", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.testsuite", + }, + Target: ~, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 55, + line: 3, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 55, + line: 3, + col: 1, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 55, + line: 3, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 59, + line: 3, + col: 5, + }, + }, + Name: "main", + }, + keywords: [], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_70_dst.uast b/uast/diff/testdata/testcase_70_dst.uast new file mode 100644 index 00000000..f89f5921 --- /dev/null +++ b/uast/diff/testdata/testcase_70_dst.uast @@ -0,0 +1,720 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 229, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 232, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n jQuery Example\n ~~~~~~~~~~~~~~\n\n A simple application that shows how Flask and jQuery get along.\n\n :copyright: (c) 2014 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 233, + line: 11, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 243, + line: 11, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 292, + line: 12, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 292, + line: 12, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 295, + line: 12, + col: 4, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 298, + line: 12, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 304, + line: 12, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 312, + line: 12, + col: 21, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 298, + line: 12, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 303, + line: 12, + col: 12, + }, + }, + Name: "Flask", + }, + keywords: [], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 316, + line: 15, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "add_numbers", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 367, + line: 17, + col: 5, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 367, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 424, + line: 17, + col: 62, + }, + }, + Format: "", + Value: "Add two numbers server side, ridiculous but well...", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 429, + line: 18, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 429, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 430, + line: 18, + col: 6, + }, + }, + Name: "a", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 433, + line: 18, + col: 9, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 450, + line: 18, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 453, + line: 18, + col: 29, + }, + }, + Format: "", + Value: "a", + }, + { '@type': "Num", + '@token': 0, + '@role': [Argument, Call, Expression, Function, Literal, Name, Number, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 455, + line: 18, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 456, + line: 18, + col: 32, + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 434, + line: 18, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 441, + line: 18, + col: 17, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 433, + line: 18, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 440, + line: 18, + col: 16, + }, + }, + Name: "request", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 441, + line: 18, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 445, + line: 18, + col: 21, + }, + }, + Name: "args", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 433, + line: 18, + col: 9, + }, + }, + Name: "get", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "type", + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 463, + line: 18, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 466, + line: 18, + col: 42, + }, + }, + Name: "int", + }, + }, + ], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 472, + line: 19, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 472, + line: 19, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 473, + line: 19, + col: 6, + }, + }, + Name: "b", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 476, + line: 19, + col: 9, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 493, + line: 19, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 496, + line: 19, + col: 29, + }, + }, + Format: "", + Value: "b", + }, + { '@type': "Num", + '@token': 0, + '@role': [Argument, Call, Expression, Function, Literal, Name, Number, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 498, + line: 19, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 499, + line: 19, + col: 32, + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 477, + line: 19, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 484, + line: 19, + col: 17, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 476, + line: 19, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 483, + line: 19, + col: 16, + }, + }, + Name: "request", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 484, + line: 19, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 488, + line: 19, + col: 21, + }, + }, + Name: "args", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 476, + line: 19, + col: 9, + }, + }, + Name: "get", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "type", + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 506, + line: 19, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 509, + line: 19, + col: 42, + }, + }, + Name: "int", + }, + }, + ], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 515, + line: 20, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 521, + line: 20, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 522, + line: 20, + col: 12, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 522, + line: 20, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 529, + line: 20, + col: 19, + }, + }, + Name: "jsonify", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "result", + }, + value: { '@type': "BinOp", + '@role': [Argument, Binary, Expression, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 537, + line: 20, + col: 27, + }, + }, + left: { '@type': "uast:Identifier", + '@role': [Binary, Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 537, + line: 20, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 538, + line: 20, + col: 28, + }, + }, + Name: "a", + }, + op: { '@type': "Add", + '@token': "+", + '@role': [Add, Arithmetic, Binary, Operator], + '@pos': { '@type': "uast:Positions", + }, + }, + right: { '@type': "uast:Identifier", + '@role': [Binary, Expression, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 541, + line: 20, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 542, + line: 20, + col: 32, + }, + }, + Name: "b", + }, + }, + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 546, + line: 23, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 579, + line: 25, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 585, + line: 25, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 586, + line: 25, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 602, + line: 25, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 614, + line: 25, + col: 40, + }, + }, + Format: "", + Value: "index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 586, + line: 25, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 601, + line: 25, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_70_src.uast b/uast/diff/testdata/testcase_70_src.uast new file mode 100644 index 00000000..39658041 --- /dev/null +++ b/uast/diff/testdata/testcase_70_src.uast @@ -0,0 +1,869 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 229, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 232, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n jQuery Example\n ~~~~~~~~~~~~~~\n\n A simple application that shows how Flask and jQuery get along.\n\n :copyright: (c) 2014 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 233, + line: 11, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 243, + line: 11, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 292, + line: 12, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 292, + line: 12, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 295, + line: 12, + col: 4, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 298, + line: 12, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 304, + line: 12, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 312, + line: 12, + col: 21, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 298, + line: 12, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 303, + line: 12, + col: 12, + }, + }, + Name: "Flask", + }, + keywords: [], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 316, + line: 15, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "add_numbers", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 367, + line: 17, + col: 5, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 367, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 424, + line: 17, + col: 62, + }, + }, + Format: "", + Value: "Add two numbers server side, ridiculous but well...", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 429, + line: 18, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 429, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 430, + line: 18, + col: 6, + }, + }, + Name: "a", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 433, + line: 18, + col: 9, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 450, + line: 18, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 453, + line: 18, + col: 29, + }, + }, + Format: "", + Value: "a", + }, + { '@type': "Num", + '@token': 0, + '@role': [Argument, Call, Expression, Function, Literal, Name, Number, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 455, + line: 18, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 456, + line: 18, + col: 32, + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 434, + line: 18, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 441, + line: 18, + col: 17, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 433, + line: 18, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 440, + line: 18, + col: 16, + }, + }, + Name: "request", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 441, + line: 18, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 445, + line: 18, + col: 21, + }, + }, + Name: "args", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 433, + line: 18, + col: 9, + }, + }, + Name: "get", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "type", + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 463, + line: 18, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 466, + line: 18, + col: 42, + }, + }, + Name: "int", + }, + }, + ], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 472, + line: 19, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 472, + line: 19, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 473, + line: 19, + col: 6, + }, + }, + Name: "b", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 476, + line: 19, + col: 9, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 493, + line: 19, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 496, + line: 19, + col: 29, + }, + }, + Format: "", + Value: "b", + }, + { '@type': "Num", + '@token': 0, + '@role': [Argument, Call, Expression, Function, Literal, Name, Number, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 498, + line: 19, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 499, + line: 19, + col: 32, + }, + }, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 477, + line: 19, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 484, + line: 19, + col: 17, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 476, + line: 19, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 483, + line: 19, + col: 16, + }, + }, + Name: "request", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 484, + line: 19, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 488, + line: 19, + col: 21, + }, + }, + Name: "args", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 476, + line: 19, + col: 9, + }, + }, + Name: "get", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "type", + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 506, + line: 19, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 509, + line: 19, + col: 42, + }, + }, + Name: "int", + }, + }, + ], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 515, + line: 20, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 521, + line: 20, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 522, + line: 20, + col: 12, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 522, + line: 20, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 529, + line: 20, + col: 19, + }, + }, + Name: "jsonify", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "result", + }, + value: { '@type': "BinOp", + '@role': [Argument, Binary, Expression, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 537, + line: 20, + col: 27, + }, + }, + left: { '@type': "uast:Identifier", + '@role': [Binary, Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 537, + line: 20, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 538, + line: 20, + col: 28, + }, + }, + Name: "a", + }, + op: { '@type': "Add", + '@token': "+", + '@role': [Add, Arithmetic, Binary, Operator], + '@pos': { '@type': "uast:Positions", + }, + }, + right: { '@type': "uast:Identifier", + '@role': [Binary, Expression, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 541, + line: 20, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 542, + line: 20, + col: 32, + }, + }, + Name: "b", + }, + }, + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 546, + line: 23, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 579, + line: 25, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 585, + line: 25, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 586, + line: 25, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 602, + line: 25, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 614, + line: 25, + col: 40, + }, + }, + Format: "", + Value: "index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 586, + line: 25, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 601, + line: 25, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 618, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 620, + line: 28, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 649, + line: 29, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 649, + line: 29, + col: 5, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 650, + line: 29, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 653, + line: 29, + col: 9, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 649, + line: 29, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 652, + line: 29, + col: 8, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 649, + line: 29, + col: 5, + }, + }, + Name: "run", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 621, + line: 28, + col: 4, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 633, + line: 28, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 643, + line: 28, + col: 26, + }, + }, + Format: "", + Value: "__main__", + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 621, + line: 28, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 629, + line: 28, + col: 12, + }, + }, + Name: "__name__", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_71_dst.uast b/uast/diff/testdata/testcase_71_dst.uast new file mode 100644 index 00000000..2fefa33d --- /dev/null +++ b/uast/diff/testdata/testcase_71_dst.uast @@ -0,0 +1,350 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 664, + line: 19, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 667, + line: 19, + col: 4, + }, + }, + Format: "", + Value: "\n flask.ext\n ~~~~~~~~~\n\n Redirect imports for extensions. This module basically makes it possible\n for us to transition from flaskext.foo to flask_foo without having to\n force all extensions to upgrade at the same time.\n\n When a user does ``from flask.ext.foo import bar`` it will attempt to\n import ``from flask_foo import bar`` first and when that fails it will\n try to import ``from flaskext.foo import bar``.\n\n We're switching from namespace packages because it was just too painful for\n everybody involved.\n\n :copyright: (c) 2015 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 674, + line: 22, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 679, + line: 22, + col: 10, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "setup", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 687, + line: 23, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 701, + line: 23, + col: 19, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "ExtensionImporter", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../../exthook", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 731, + line: 24, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 731, + line: 24, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 739, + line: 24, + col: 13, + }, + }, + Name: "importer", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 742, + line: 24, + col: 16, + }, + }, + args: [ + { '@type': "List", + '@role': [Argument, Call, Expression, Function, List, Literal, Name, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 760, + line: 24, + col: 34, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 761, + line: 24, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 771, + line: 24, + col: 45, + }, + }, + Format: "", + Value: "flask_%s", + }, + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 773, + line: 24, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 786, + line: 24, + col: 60, + }, + }, + Format: "", + Value: "flaskext.%s", + }, + ], + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 789, + line: 24, + col: 63, + }, + end: { '@type': "uast:Position", + offset: 797, + line: 24, + col: 71, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 742, + line: 24, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 759, + line: 24, + col: 33, + }, + }, + Name: "ExtensionImporter", + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 803, + line: 25, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 803, + line: 25, + col: 5, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 804, + line: 25, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 812, + line: 25, + col: 14, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 803, + line: 25, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 811, + line: 25, + col: 13, + }, + }, + Name: "importer", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 803, + line: 25, + col: 5, + }, + }, + Name: "install", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 824, + line: 28, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 824, + line: 28, + col: 1, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 824, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 829, + line: 28, + col: 6, + }, + }, + Name: "setup", + }, + keywords: [], + }, + }, + { '@type': "Delete", + '@token': "del", + '@role': [Incomplete, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 832, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 835, + line: 29, + col: 4, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 836, + line: 29, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 841, + line: 29, + col: 10, + }, + }, + Name: "setup", + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_71_src.uast b/uast/diff/testdata/testcase_71_src.uast new file mode 100644 index 00000000..0bae8e2f --- /dev/null +++ b/uast/diff/testdata/testcase_71_src.uast @@ -0,0 +1,350 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 664, + line: 19, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 667, + line: 19, + col: 4, + }, + }, + Format: "", + Value: "\n flask.ext\n ~~~~~~~~~\n\n Redirect imports for extensions. This module basically makes it possible\n for us to transition from flaskext.foo to flask_foo without having to\n force all extensions to upgrade at the same time.\n\n When a user does ``from flask.ext.foo import bar`` it will attempt to\n import ``from flask_foo import bar`` first and when that fails it will\n try to import ``from flaskext.foo import bar``.\n\n We're switching from namespace packages because it was just too painful for\n everybody involved.\n\n :copyright: (c) 2014 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 674, + line: 22, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 679, + line: 22, + col: 10, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "setup", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 687, + line: 23, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 701, + line: 23, + col: 19, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "ExtensionImporter", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../../exthook", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 731, + line: 24, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 731, + line: 24, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 739, + line: 24, + col: 13, + }, + }, + Name: "importer", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 742, + line: 24, + col: 16, + }, + }, + args: [ + { '@type': "List", + '@role': [Argument, Call, Expression, Function, List, Literal, Name, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 760, + line: 24, + col: 34, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 761, + line: 24, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 771, + line: 24, + col: 45, + }, + }, + Format: "", + Value: "flask_%s", + }, + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 773, + line: 24, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 786, + line: 24, + col: 60, + }, + }, + Format: "", + Value: "flaskext.%s", + }, + ], + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 789, + line: 24, + col: 63, + }, + end: { '@type': "uast:Position", + offset: 797, + line: 24, + col: 71, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 742, + line: 24, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 759, + line: 24, + col: 33, + }, + }, + Name: "ExtensionImporter", + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 803, + line: 25, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 803, + line: 25, + col: 5, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 804, + line: 25, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 812, + line: 25, + col: 14, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 803, + line: 25, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 811, + line: 25, + col: 13, + }, + }, + Name: "importer", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 803, + line: 25, + col: 5, + }, + }, + Name: "install", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 824, + line: 28, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 824, + line: 28, + col: 1, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 824, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 829, + line: 28, + col: 6, + }, + }, + Name: "setup", + }, + keywords: [], + }, + }, + { '@type': "Delete", + '@token': "del", + '@role': [Incomplete, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 832, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 835, + line: 29, + col: 4, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 836, + line: 29, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 841, + line: 29, + col: 10, + }, + }, + Name: "setup", + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_72_dst.uast b/uast/diff/testdata/testcase_72_dst.uast new file mode 100644 index 00000000..9145c39e --- /dev/null +++ b/uast/diff/testdata/testcase_72_dst.uast @@ -0,0 +1,464 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 15, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 387, + line: 15, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 411, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 422, + line: 16, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 455, + line: 18, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 488, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 500, + line: 19, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 515, + line: 20, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 528, + line: 20, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 666, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 679, + line: 23, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 740, + line: 24, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 752, + line: 24, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 767, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 783, + line: 25, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 869, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 871, + line: 28, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 892, + line: 29, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 905, + line: 29, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 872, + line: 28, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 886, + line: 28, + col: 18, + }, + }, + Name: "json_available", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_72_src.uast b/uast/diff/testdata/testcase_72_src.uast new file mode 100644 index 00000000..b4b1531b --- /dev/null +++ b/uast/diff/testdata/testcase_72_src.uast @@ -0,0 +1,456 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 15, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 387, + line: 15, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 411, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 422, + line: 16, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 455, + line: 18, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 488, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 500, + line: 19, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 515, + line: 20, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 528, + line: 20, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 639, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 652, + line: 22, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 713, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 725, + line: 23, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 740, + line: 24, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 756, + line: 24, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 842, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 844, + line: 27, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 865, + line: 28, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 878, + line: 28, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 845, + line: 27, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 859, + line: 27, + col: 18, + }, + }, + Name: "json_available", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_73_dst.uast b/uast/diff/testdata/testcase_73_dst.uast new file mode 100644 index 00000000..7772ebc3 --- /dev/null +++ b/uast/diff/testdata/testcase_73_dst.uast @@ -0,0 +1,472 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 15, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 387, + line: 15, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 411, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 422, + line: 16, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 455, + line: 18, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 488, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 500, + line: 19, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 515, + line: 20, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 528, + line: 20, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 681, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 694, + line: 23, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 755, + line: 24, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 767, + line: 24, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 782, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 798, + line: 25, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 884, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 886, + line: 28, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 907, + line: 29, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 920, + line: 29, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 887, + line: 28, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 901, + line: 28, + col: 18, + }, + }, + Name: "json_available", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_73_src.uast b/uast/diff/testdata/testcase_73_src.uast new file mode 100644 index 00000000..9145c39e --- /dev/null +++ b/uast/diff/testdata/testcase_73_src.uast @@ -0,0 +1,464 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 15, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 387, + line: 15, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 411, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 422, + line: 16, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 455, + line: 18, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 488, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 500, + line: 19, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 515, + line: 20, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 528, + line: 20, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 666, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 679, + line: 23, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 740, + line: 24, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 752, + line: 24, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 767, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 783, + line: 25, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 869, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 871, + line: 28, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 892, + line: 29, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 905, + line: 29, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 872, + line: 28, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 886, + line: 28, + col: 18, + }, + }, + Name: "json_available", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_74_dst.uast b/uast/diff/testdata/testcase_74_dst.uast new file mode 100644 index 00000000..82d91a6d --- /dev/null +++ b/uast/diff/testdata/testcase_74_dst.uast @@ -0,0 +1,533 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 15, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 387, + line: 15, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 411, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 422, + line: 16, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 455, + line: 18, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 488, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 500, + line: 19, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 515, + line: 20, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 528, + line: 20, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 681, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 694, + line: 23, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 755, + line: 24, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 767, + line: 24, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 782, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 798, + line: 25, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 861, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 874, + line: 28, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1022, + line: 32, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1024, + line: 32, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1045, + line: 33, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1058, + line: 33, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1025, + line: 32, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1039, + line: 32, + col: 18, + }, + }, + Name: "json_available", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_74_src.uast b/uast/diff/testdata/testcase_74_src.uast new file mode 100644 index 00000000..7772ebc3 --- /dev/null +++ b/uast/diff/testdata/testcase_74_src.uast @@ -0,0 +1,472 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 15, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 387, + line: 15, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 411, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 422, + line: 16, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 455, + line: 18, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 488, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 500, + line: 19, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 515, + line: 20, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 528, + line: 20, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 681, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 694, + line: 23, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 755, + line: 24, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 767, + line: 24, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 782, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 798, + line: 25, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 884, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 886, + line: 28, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 907, + line: 29, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 920, + line: 29, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 887, + line: 28, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 901, + line: 28, + col: 18, + }, + }, + Name: "json_available", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_75_dst.uast b/uast/diff/testdata/testcase_75_dst.uast new file mode 100644 index 00000000..ad237dd4 --- /dev/null +++ b/uast/diff/testdata/testcase_75_dst.uast @@ -0,0 +1,350 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 664, + line: 19, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 667, + line: 19, + col: 4, + }, + }, + Format: "", + Value: "\n flask.ext\n ~~~~~~~~~\n\n Redirect imports for extensions. This module basically makes it possible\n for us to transition from flaskext.foo to flask_foo without having to\n force all extensions to upgrade at the same time.\n\n When a user does ``from flask.ext.foo import bar`` it will attempt to\n import ``from flask_foo import bar`` first and when that fails it will\n try to import ``from flaskext.foo import bar``.\n\n We're switching from namespace packages because it was just too painful for\n everybody involved.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 674, + line: 22, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 679, + line: 22, + col: 10, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "setup", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 687, + line: 23, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 701, + line: 23, + col: 19, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "ExtensionImporter", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../../exthook", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 731, + line: 24, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 731, + line: 24, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 739, + line: 24, + col: 13, + }, + }, + Name: "importer", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 742, + line: 24, + col: 16, + }, + }, + args: [ + { '@type': "List", + '@role': [Argument, Call, Expression, Function, List, Literal, Name, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 760, + line: 24, + col: 34, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 761, + line: 24, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 771, + line: 24, + col: 45, + }, + }, + Format: "", + Value: "flask_%s", + }, + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 773, + line: 24, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 786, + line: 24, + col: 60, + }, + }, + Format: "", + Value: "flaskext.%s", + }, + ], + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 789, + line: 24, + col: 63, + }, + end: { '@type': "uast:Position", + offset: 797, + line: 24, + col: 71, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 742, + line: 24, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 759, + line: 24, + col: 33, + }, + }, + Name: "ExtensionImporter", + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 803, + line: 25, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 803, + line: 25, + col: 5, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 804, + line: 25, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 812, + line: 25, + col: 14, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 803, + line: 25, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 811, + line: 25, + col: 13, + }, + }, + Name: "importer", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 803, + line: 25, + col: 5, + }, + }, + Name: "install", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 824, + line: 28, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 824, + line: 28, + col: 1, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 824, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 829, + line: 28, + col: 6, + }, + }, + Name: "setup", + }, + keywords: [], + }, + }, + { '@type': "Delete", + '@token': "del", + '@role': [Incomplete, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 832, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 835, + line: 29, + col: 4, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 836, + line: 29, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 841, + line: 29, + col: 10, + }, + }, + Name: "setup", + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_75_src.uast b/uast/diff/testdata/testcase_75_src.uast new file mode 100644 index 00000000..c188349a --- /dev/null +++ b/uast/diff/testdata/testcase_75_src.uast @@ -0,0 +1,3684 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 664, + line: 19, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 667, + line: 19, + col: 4, + }, + }, + Format: "", + Value: "\n flask.ext\n ~~~~~~~~~\n\n Redirect imports for extensions. This module basically makes it possible\n for us to transition from flaskext.foo to flask_foo without having to\n force all extensions to upgrade at the same time.\n\n When a user does ``from flask.ext.foo import bar`` it will attempt to\n import ``from flask_foo import bar`` first and when that fails it will\n try to import ``from flaskext.foo import bar``.\n\n We're switching from namespace packages because it was just too painful for\n everybody involved.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "ClassDef", + '@token': "_ExtensionImporter", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 676, + line: 22, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 694, + line: 22, + col: 25, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 695, + line: 22, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 701, + line: 22, + col: 32, + }, + }, + Name: "object", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 914, + line: 26, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 708, + line: 23, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 921, + line: 26, + col: 8, + }, + }, + Format: "", + Value: "This importer redirects imports from this submodule to other locations.\n This makes it possible to transition from the old flaskext.name to the\n newer flask_name without people having a hard time.\n ", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 926, + line: 27, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 926, + line: 27, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 941, + line: 27, + col: 20, + }, + }, + Name: "_module_choices", + }, + ], + value: { '@type': "List", + '@role': [Expression, List, Literal, Primitive, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 944, + line: 27, + col: 23, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 945, + line: 27, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 955, + line: 27, + col: 34, + }, + }, + Format: "", + Value: "flask_%s", + }, + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 957, + line: 27, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 970, + line: 27, + col: 49, + }, + }, + Format: "", + Value: "flaskext.%s", + }, + ], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 981, + line: 29, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 989, + line: 29, + col: 17, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "__init__", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1005, + line: 30, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1013, + line: 30, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "meta_path", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "sys", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1039, + line: 31, + col: 9, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1040, + line: 31, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 1044, + line: 31, + col: 14, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1039, + line: 31, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1043, + line: 31, + col: 13, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1039, + line: 31, + col: 9, + }, + }, + Name: "prefix", + }, + ], + }, + ], + value: { '@type': "BinOp", + '@role': [Binary, Expression, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1053, + line: 31, + col: 23, + }, + }, + left: { '@type': "uast:Identifier", + '@role': [Binary, Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1053, + line: 31, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 1061, + line: 31, + col: 31, + }, + }, + Name: "__name__", + }, + op: { '@type': "Add", + '@token': "+", + '@role': [Add, Arithmetic, Binary, Operator], + '@pos': { '@type': "uast:Positions", + }, + }, + right: { '@type': "uast:String", + '@role': [Binary, Expression, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1043, + line: 31, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1044, + line: 31, + col: 14, + }, + }, + Format: "", + Value: ".", + }, + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1076, + line: 32, + col: 9, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1077, + line: 32, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 1081, + line: 32, + col: 14, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1076, + line: 32, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1080, + line: 32, + col: 13, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1076, + line: 32, + col: 9, + }, + }, + Name: "prefix_cutoff", + }, + ], + }, + ], + value: { '@type': "BinOp", + '@role': [Binary, Expression, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1097, + line: 32, + col: 30, + }, + }, + left: { '@type': "Call", + '@role': [Binary, Call, Expression, Function, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1097, + line: 32, + col: 30, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1080, + line: 32, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1081, + line: 32, + col: 14, + }, + }, + Format: "", + Value: ".", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1098, + line: 32, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 1106, + line: 32, + col: 39, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1097, + line: 32, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 1105, + line: 32, + col: 38, + }, + }, + Name: "__name__", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1097, + line: 32, + col: 30, + }, + }, + Name: "count", + }, + ], + }, + keywords: [], + kwargs: ~, + starargs: ~, + }, + op: { '@type': "Add", + '@token': "+", + '@role': [Add, Arithmetic, Binary, Operator], + '@pos': { '@type': "uast:Positions", + }, + }, + right: { '@type': "Num", + '@token': 1, + '@role': [Binary, Expression, Literal, Number, Primitive, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1119, + line: 32, + col: 52, + }, + end: { '@type': "uast:Position", + offset: 1120, + line: 32, + col: 53, + }, + }, + }, + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1486, + line: 39, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1491, + line: 39, + col: 18, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_name", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1508, + line: 40, + col: 13, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1508, + line: 40, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1511, + line: 40, + col: 16, + }, + }, + Name: "cls", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1514, + line: 40, + col: 19, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1519, + line: 40, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 1520, + line: 40, + col: 25, + }, + }, + Name: "x", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1514, + line: 40, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 1518, + line: 40, + col: 23, + }, + }, + Name: "type", + }, + keywords: [], + kwargs: ~, + starargs: ~, + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1534, + line: 41, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1540, + line: 41, + col: 19, + }, + }, + value: { '@type': "BinOp", + '@role': [Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1562, + line: 41, + col: 41, + }, + }, + left: { '@type': "BinOp", + '@role': [Binary, Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1541, + line: 41, + col: 20, + }, + }, + left: { '@type': "QualifiedIdentifier", + '@role': [Binary, Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1542, + line: 41, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 1545, + line: 41, + col: 24, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1541, + line: 41, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 1544, + line: 41, + col: 23, + }, + }, + Name: "cls", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1541, + line: 41, + col: 20, + }, + }, + Name: "__module__", + }, + ], + }, + op: { '@type': "Add", + '@token': "+", + '@role': [Add, Arithmetic, Binary, Operator], + '@pos': { '@type': "uast:Positions", + }, + }, + right: { '@type': "uast:String", + '@role': [Binary, Expression, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1544, + line: 41, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 1545, + line: 41, + col: 24, + }, + }, + Format: "", + Value: ".", + }, + }, + op: { '@type': "Add", + '@token': "+", + '@role': [Add, Arithmetic, Binary, Operator], + '@pos': { '@type': "uast:Positions", + }, + }, + right: { '@type': "QualifiedIdentifier", + '@role': [Binary, Expression, Identifier, Qualified, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1565, + line: 41, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 1568, + line: 41, + col: 47, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1564, + line: 41, + col: 43, + }, + end: { '@type': "uast:Position", + offset: 1567, + line: 41, + col: 46, + }, + }, + Name: "cls", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1564, + line: 41, + col: 43, + }, + }, + Name: "__name__", + }, + ], + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1492, + line: 39, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 1493, + line: 39, + col: 20, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1492, + line: 39, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 1493, + line: 39, + col: 20, + }, + }, + Name: "x", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1585, + line: 42, + col: 9, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1585, + line: 42, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1589, + line: 42, + col: 13, + }, + }, + Name: "this", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1592, + line: 42, + col: 16, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1598, + line: 42, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 1602, + line: 42, + col: 26, + }, + }, + Name: "self", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1592, + line: 42, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 1597, + line: 42, + col: 21, + }, + }, + Name: "_name", + }, + keywords: [], + kwargs: ~, + starargs: ~, + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1612, + line: 43, + col: 9, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1612, + line: 43, + col: 9, + }, + }, + ctx: "Store", + slice: { '@type': "Slice", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + lower: ~, + step: ~, + upper: ~, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1612, + line: 43, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1621, + line: 43, + col: 18, + }, + }, + Name: "meta_path", + }, + }, + ], + value: { '@type': "BinOp", + '@role': [Binary, Expression, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1627, + line: 43, + col: 24, + }, + }, + left: { '@type': "ListComp", + '@role': [Binary, Expression, For, Left, List], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1628, + line: 43, + col: 25, + }, + }, + elt: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1628, + line: 43, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 1629, + line: 43, + col: 26, + }, + }, + Name: "x", + }, + generators: [ + { '@type': "comprehension", + '@role': [Expression, For, Incomplete, Iterator], + '@pos': { '@type': "uast:Positions", + }, + ifs: [ + { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1652, + line: 43, + col: 49, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1664, + line: 43, + col: 61, + }, + end: { '@type': "uast:Position", + offset: 1668, + line: 43, + col: 65, + }, + }, + Name: "this", + }, + ], + }, + left: { '@type': "Call", + '@role': [Call, Expression, Function, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1652, + line: 43, + col: 49, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1658, + line: 43, + col: 55, + }, + end: { '@type': "uast:Position", + offset: 1659, + line: 43, + col: 56, + }, + }, + Name: "x", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1652, + line: 43, + col: 49, + }, + end: { '@type': "uast:Position", + offset: 1657, + line: 43, + col: 54, + }, + }, + Name: "_name", + }, + keywords: [], + kwargs: ~, + starargs: ~, + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "NotEq", + '@token': "!=", + '@role': [Equal, Not, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + ], + iter: { '@type': "uast:Identifier", + '@role': [For, Statement, Update], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1639, + line: 43, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 1648, + line: 43, + col: 45, + }, + }, + Name: "meta_path", + }, + target: { '@type': "uast:Identifier", + '@role': [Expression, For], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1634, + line: 43, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 1635, + line: 43, + col: 32, + }, + }, + Name: "x", + }, + }, + ], + }, + op: { '@type': "Add", + '@token': "+", + '@role': [Add, Arithmetic, Binary, Operator], + '@pos': { '@type': "uast:Positions", + }, + }, + right: { '@type': "List", + '@role': [Binary, Expression, List, Literal, Primitive, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1672, + line: 43, + col: 69, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1673, + line: 43, + col: 70, + }, + end: { '@type': "uast:Position", + offset: 1677, + line: 43, + col: 74, + }, + }, + Name: "self", + }, + ], + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 990, + line: 29, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 994, + line: 29, + col: 22, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 990, + line: 29, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 994, + line: 29, + col: 22, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1688, + line: 45, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1699, + line: 45, + col: 20, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "find_module", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1736, + line: 46, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1738, + line: 46, + col: 11, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1785, + line: 47, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1791, + line: 47, + col: 19, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1792, + line: 47, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 1796, + line: 47, + col: 24, + }, + }, + Name: "self", + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Call", + '@role': [Call, Condition, Expression, Function, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1739, + line: 46, + col: 12, + }, + }, + args: [ + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1760, + line: 46, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 1764, + line: 46, + col: 37, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1759, + line: 46, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 1763, + line: 46, + col: 36, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1759, + line: 46, + col: 32, + }, + }, + Name: "prefix", + }, + ], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1740, + line: 46, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1748, + line: 46, + col: 21, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1739, + line: 46, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 1747, + line: 46, + col: 20, + }, + }, + Name: "fullname", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1739, + line: 46, + col: 12, + }, + }, + Name: "startswith", + }, + ], + }, + keywords: [], + kwargs: ~, + starargs: ~, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1700, + line: 45, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 1704, + line: 45, + col: 25, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1700, + line: 45, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 1704, + line: 45, + col: 25, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1706, + line: 45, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 1714, + line: 45, + col: 35, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1706, + line: 45, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 1714, + line: 45, + col: 35, + }, + }, + Name: "fullname", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1716, + line: 45, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 1720, + line: 45, + col: 41, + }, + }, + Init: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1721, + line: 45, + col: 42, + }, + end: { '@type': "uast:Position", + offset: 1725, + line: 45, + col: 46, + }, + }, + Name: "None", + }, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1716, + line: 45, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 1720, + line: 45, + col: 41, + }, + }, + Name: "path", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1806, + line: 49, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1817, + line: 49, + col: 20, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "load_module", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1843, + line: 50, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1851, + line: 50, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "modules", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "exc_info", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "sys", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1885, + line: 51, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1887, + line: 51, + col: 11, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1921, + line: 52, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 1927, + line: 52, + col: 19, + }, + }, + value: { '@type': "Subscript", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1928, + line: 52, + col: 20, + }, + }, + ctx: "Load", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1936, + line: 52, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 1944, + line: 52, + col: 36, + }, + }, + Name: "fullname", + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1928, + line: 52, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 1935, + line: 52, + col: 27, + }, + }, + Name: "modules", + }, + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1888, + line: 51, + col: 12, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1900, + line: 51, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 1907, + line: 51, + col: 31, + }, + }, + Name: "modules", + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1888, + line: 51, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 1896, + line: 51, + col: 20, + }, + }, + Name: "fullname", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "In", + '@token': "in", + '@role': [Contains, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1954, + line: 53, + col: 9, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1954, + line: 53, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1961, + line: 53, + col: 16, + }, + }, + Name: "modname", + }, + ], + value: { '@type': "Subscript", + '@role': [Expression, Incomplete, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1964, + line: 53, + col: 19, + }, + }, + ctx: "Load", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 2005, + line: 53, + col: 60, + }, + end: { '@type': "uast:Position", + offset: 2009, + line: 53, + col: 64, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 2004, + line: 53, + col: 59, + }, + end: { '@type': "uast:Position", + offset: 2008, + line: 53, + col: 63, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 2004, + line: 53, + col: 59, + }, + }, + Name: "prefix_cutoff", + }, + ], + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1964, + line: 53, + col: 19, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1972, + line: 53, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 1973, + line: 53, + col: 28, + }, + }, + Format: "", + Value: ".", + }, + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1985, + line: 53, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 1989, + line: 53, + col: 44, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1984, + line: 53, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 1988, + line: 53, + col: 43, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1984, + line: 53, + col: 39, + }, + }, + Name: "prefix_cutoff", + }, + ], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1965, + line: 53, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 1973, + line: 53, + col: 28, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1964, + line: 53, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 1972, + line: 53, + col: 27, + }, + }, + Name: "fullname", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1964, + line: 53, + col: 19, + }, + }, + Name: "split", + }, + ], + }, + keywords: [], + kwargs: ~, + starargs: ~, + }, + }, + }, + { '@type': "For", + '@token': "for", + '@role': [For, Iterator, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 2032, + line: 54, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 2035, + line: 54, + col: 12, + }, + }, + body: { '@type': "For.body", + '@role': [Body, For, Then], + 'body_stmts': [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 2078, + line: 55, + col: 13, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 2078, + line: 55, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 2086, + line: 55, + col: 21, + }, + }, + Name: "realname", + }, + ], + value: { '@type': "BinOp", + '@role': [Binary, Expression, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 2089, + line: 55, + col: 24, + }, + }, + left: { '@type': "uast:Identifier", + '@role': [Binary, Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 2089, + line: 55, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 2093, + line: 55, + col: 28, + }, + }, + Name: "path", + }, + op: { '@type': "Mod", + '@token': "%", + '@role': [Arithmetic, Binary, Module, Operator], + '@pos': { '@type': "uast:Positions", + }, + }, + right: { '@type': "uast:Identifier", + '@role': [Binary, Expression, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 2096, + line: 55, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 2103, + line: 55, + col: 38, + }, + }, + Name: "modname", + }, + }, + }, + { '@type': "TryExcept", + '@role': [Catch, Statement, Try], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 2116, + line: 56, + col: 13, + }, + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 2137, + line: 57, + col: 17, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 2137, + line: 57, + col: 17, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 2148, + line: 57, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 2156, + line: 57, + col: 36, + }, + }, + Name: "realname", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 2137, + line: 57, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 2147, + line: 57, + col: 27, + }, + }, + Name: "__import__", + }, + keywords: [], + kwargs: ~, + starargs: ~, + }, + }, + ], + handlers: [ + { '@type': "ExceptHandler", + '@role': [Catch, Identifier, Try], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 2170, + line: 58, + col: 13, + }, + }, + '@token': ~, + body: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 2206, + line: 59, + col: 17, + }, + }, + targets: [ + { '@type': "Tuple", + '@role': [Expression, Left, Literal, Primitive, Tuple], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 2206, + line: 59, + col: 17, + }, + }, + ctx: "Store", + elts: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 2206, + line: 59, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 2214, + line: 59, + col: 25, + }, + }, + Name: "exc_type", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 2216, + line: 59, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 2225, + line: 59, + col: 36, + }, + }, + Name: "exc_value", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 2227, + line: 59, + col: 38, + }, + end: { '@type': "uast:Position", + offset: 2229, + line: 59, + col: 40, + }, + }, + Name: "tb", + }, + ], + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 2232, + line: 59, + col: 43, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 2232, + line: 59, + col: 43, + }, + end: { '@type': "uast:Position", + offset: 2240, + line: 59, + col: 51, + }, + }, + Name: "exc_info", + }, + keywords: [], + kwargs: ~, + starargs: ~, + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 2976, + line: 70, + col: 17, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 2976, + line: 70, + col: 17, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 2988, + line: 70, + col: 29, + }, + end: { '@type': "uast:Position", + offset: 2996, + line: 70, + col: 37, + }, + }, + Name: "fullname", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 2998, + line: 70, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 3002, + line: 70, + col: 43, + }, + }, + Name: "None", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 2977, + line: 70, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 2984, + line: 70, + col: 25, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 2976, + line: 70, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 2983, + line: 70, + col: 24, + }, + }, + Name: "modules", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 2976, + line: 70, + col: 17, + }, + }, + Name: "pop", + }, + ], + }, + keywords: [], + kwargs: ~, + starargs: ~, + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 3020, + line: 71, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 3022, + line: 71, + col: 19, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Raise", + '@token': "raise", + '@role': [Statement, Throw], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 3086, + line: 72, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 3091, + line: 72, + col: 26, + }, + }, + inst: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 3102, + line: 72, + col: 37, + }, + end: { '@type': "uast:Position", + offset: 3111, + line: 72, + col: 46, + }, + }, + Name: "exc_value", + }, + tback: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 3113, + line: 72, + col: 48, + }, + end: { '@type': "uast:Position", + offset: 3115, + line: 72, + col: 50, + }, + }, + Name: "tb", + }, + type: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 3092, + line: 72, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 3100, + line: 72, + col: 35, + }, + }, + Name: "exc_type", + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Call", + '@role': [Call, Condition, Expression, Function, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 3023, + line: 71, + col: 20, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 3051, + line: 71, + col: 48, + }, + end: { '@type': "uast:Position", + offset: 3059, + line: 71, + col: 56, + }, + }, + Name: "realname", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 3061, + line: 71, + col: 58, + }, + end: { '@type': "uast:Position", + offset: 3063, + line: 71, + col: 60, + }, + }, + Name: "tb", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 3024, + line: 71, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 3028, + line: 71, + col: 25, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 3023, + line: 71, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 3027, + line: 71, + col: 24, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 3023, + line: 71, + col: 20, + }, + }, + Name: "is_important_traceback", + }, + ], + }, + keywords: [], + kwargs: ~, + starargs: ~, + }, + }, + { '@type': "Continue", + '@token': "continue", + '@role': [Continue, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 3132, + line: 73, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 3140, + line: 73, + col: 25, + }, + }, + }, + ], + type: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 2177, + line: 58, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 2188, + line: 58, + col: 31, + }, + }, + Name: "ImportError", + }, + }, + ], + orelse: [], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 3153, + line: 74, + col: 13, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 3153, + line: 74, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 3159, + line: 74, + col: 19, + }, + }, + Name: "module", + }, + { '@type': "Subscript", + '@role': [Expression, Incomplete, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 3162, + line: 74, + col: 22, + }, + }, + ctx: "Store", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 3170, + line: 74, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 3178, + line: 74, + col: 38, + }, + }, + Name: "fullname", + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 3162, + line: 74, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 3169, + line: 74, + col: 29, + }, + }, + Name: "modules", + }, + }, + ], + value: { '@type': "Subscript", + '@role': [Expression, Incomplete, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 3182, + line: 74, + col: 42, + }, + }, + ctx: "Load", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 3190, + line: 74, + col: 50, + }, + end: { '@type': "uast:Position", + offset: 3198, + line: 74, + col: 58, + }, + }, + Name: "realname", + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 3182, + line: 74, + col: 42, + }, + end: { '@type': "uast:Position", + offset: 3189, + line: 74, + col: 49, + }, + }, + Name: "modules", + }, + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 3212, + line: 75, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 3214, + line: 75, + col: 15, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 3251, + line: 76, + col: 17, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 3251, + line: 76, + col: 17, + }, + }, + args: [ + { '@type': "Subscript", + '@role': [Argument, Call, Expression, Function, Incomplete, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 3259, + line: 76, + col: 25, + }, + }, + ctx: "Load", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 3267, + line: 76, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 3275, + line: 76, + col: 41, + }, + }, + Name: "__name__", + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 3259, + line: 76, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 3266, + line: 76, + col: 32, + }, + }, + Name: "modules", + }, + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 3278, + line: 76, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 3285, + line: 76, + col: 51, + }, + }, + Name: "modname", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 3287, + line: 76, + col: 53, + }, + end: { '@type': "uast:Position", + offset: 3293, + line: 76, + col: 59, + }, + }, + Name: "module", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 3251, + line: 76, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 3258, + line: 76, + col: 24, + }, + }, + Name: "setattr", + }, + keywords: [], + kwargs: ~, + starargs: ~, + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 3215, + line: 75, + col: 16, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 3226, + line: 75, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 3233, + line: 75, + col: 34, + }, + }, + Name: "modname", + }, + ], + }, + left: { '@type': "uast:String", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 3215, + line: 75, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 3218, + line: 75, + col: 19, + }, + }, + Format: "", + Value: ".", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "NotIn", + '@token': "not in", + '@role': [Contains, Not, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 3307, + line: 77, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 3313, + line: 77, + col: 19, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 3314, + line: 77, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 3320, + line: 77, + col: 26, + }, + }, + Name: "module", + }, + }, + ], + }, + iter: { '@type': "QualifiedIdentifier", + '@role': [Expression, For, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 2045, + line: 54, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 2049, + line: 54, + col: 26, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 2044, + line: 54, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 2048, + line: 54, + col: 25, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 2044, + line: 54, + col: 21, + }, + }, + Name: "_module_choices", + }, + ], + }, + orelse: { '@type': "For.orelse", + '@token': "else", + '@role': [Body, Else, For], + 'else_stmts': [], + }, + target: { '@type': "uast:Identifier", + '@role': [For, Update], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 2036, + line: 54, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 2040, + line: 54, + col: 17, + }, + }, + Name: "path", + }, + }, + { '@type': "Raise", + '@token': "raise", + '@role': [Statement, Throw], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 3329, + line: 78, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 3334, + line: 78, + col: 14, + }, + }, + inst: ~, + tback: ~, + type: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 3335, + line: 78, + col: 15, + }, + }, + args: [ + { '@type': "BinOp", + '@role': [Argument, Binary, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 3347, + line: 78, + col: 27, + }, + }, + left: { '@type': "uast:String", + '@role': [Binary, Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 3347, + line: 78, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 3367, + line: 78, + col: 47, + }, + }, + Format: "", + Value: "No module named %s", + }, + op: { '@type': "Mod", + '@token': "%", + '@role': [Arithmetic, Binary, Module, Operator], + '@pos': { '@type': "uast:Positions", + }, + }, + right: { '@type': "uast:Identifier", + '@role': [Binary, Expression, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 3370, + line: 78, + col: 50, + }, + end: { '@type': "uast:Position", + offset: 3378, + line: 78, + col: 58, + }, + }, + Name: "fullname", + }, + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 3335, + line: 78, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 3346, + line: 78, + col: 26, + }, + }, + Name: "ImportError", + }, + keywords: [], + kwargs: ~, + starargs: ~, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1818, + line: 49, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 1822, + line: 49, + col: 25, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1818, + line: 49, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 1822, + line: 49, + col: 25, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1824, + line: 49, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 1832, + line: 49, + col: 35, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1824, + line: 49, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 1832, + line: 49, + col: 35, + }, + }, + Name: "fullname", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 3389, + line: 80, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 3411, + line: 80, + col: 31, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "is_important_traceback", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 3753, + line: 86, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 3449, + line: 81, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 3764, + line: 86, + col: 12, + }, + }, + Format: "", + Value: "Walks a traceback's frames and checks if any of the frames\n originated in the given important module. If that is the case\n then we were able to import the module itself but apparently\n something went wrong when the module was imported. (Eg: import\n of an import failed).\n ", + }, + }, + { '@type': "While", + '@token': "while", + '@role': [Statement, While], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4681, + line: 101, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 4686, + line: 101, + col: 14, + }, + }, + body: { '@type': "For.body", + '@role': [Body, Then, While], + 'body_stmts': [ + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4715, + line: 102, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 4717, + line: 102, + col: 15, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4793, + line: 103, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 4799, + line: 103, + col: 23, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4800, + line: 103, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 4804, + line: 103, + col: 28, + }, + }, + Name: "True", + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4718, + line: 102, + col: 16, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4759, + line: 102, + col: 57, + }, + end: { '@type': "uast:Position", + offset: 4775, + line: 102, + col: 73, + }, + }, + Name: "important_module", + }, + ], + }, + left: { '@type': "Call", + '@role': [Call, Expression, Function, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4718, + line: 102, + col: 16, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4744, + line: 102, + col: 42, + }, + end: { '@type': "uast:Position", + offset: 4754, + line: 102, + col: 52, + }, + }, + Format: "", + Value: "__name__", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4719, + line: 102, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 4721, + line: 102, + col: 19, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4718, + line: 102, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 4720, + line: 102, + col: 18, + }, + }, + Name: "tb", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4721, + line: 102, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 4729, + line: 102, + col: 27, + }, + }, + Name: "tb_frame", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4730, + line: 102, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 4739, + line: 102, + col: 37, + }, + }, + Name: "f_globals", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4718, + line: 102, + col: 16, + }, + }, + Name: "get", + }, + ], + }, + keywords: [], + kwargs: ~, + starargs: ~, + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4817, + line: 104, + col: 13, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4817, + line: 104, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 4819, + line: 104, + col: 15, + }, + }, + Name: "tb", + }, + ], + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4823, + line: 104, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 4825, + line: 104, + col: 21, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4822, + line: 104, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 4824, + line: 104, + col: 20, + }, + }, + Name: "tb", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4822, + line: 104, + col: 18, + }, + }, + Name: "tb_next", + }, + ], + }, + }, + ], + }, + orelse: { '@type': "For.orelse", + '@token': "else", + '@role': [Body, Else, While], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, While], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4687, + line: 101, + col: 15, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4697, + line: 101, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 4701, + line: 101, + col: 29, + }, + }, + Name: "None", + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4687, + line: 101, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 4689, + line: 101, + col: 17, + }, + }, + Name: "tb", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "IsNot", + '@token': "is not", + '@role': [Identical, Not, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4841, + line: 105, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 4847, + line: 105, + col: 15, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4848, + line: 105, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 4853, + line: 105, + col: 21, + }, + }, + Name: "False", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 3412, + line: 80, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 3416, + line: 80, + col: 36, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 3412, + line: 80, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 3416, + line: 80, + col: 36, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 3418, + line: 80, + col: 38, + }, + end: { '@type': "uast:Position", + offset: 3434, + line: 80, + col: 54, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 3418, + line: 80, + col: 38, + }, + end: { '@type': "uast:Position", + offset: 3434, + line: 80, + col: 54, + }, + }, + Name: "important_module", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 3436, + line: 80, + col: 56, + }, + end: { '@type': "uast:Position", + offset: 3438, + line: 80, + col: 58, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 3436, + line: 80, + col: 56, + }, + end: { '@type': "uast:Position", + offset: 3438, + line: 80, + col: 58, + }, + }, + Name: "tb", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4856, + line: 108, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4856, + line: 108, + col: 1, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4856, + line: 108, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 4874, + line: 108, + col: 19, + }, + }, + Name: "_ExtensionImporter", + }, + keywords: [], + kwargs: ~, + starargs: ~, + }, + }, + { '@type': "Delete", + '@token': "del", + '@role': [Incomplete, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4877, + line: 109, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 4880, + line: 109, + col: 4, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 4881, + line: 109, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 4899, + line: 109, + col: 23, + }, + }, + Name: "_ExtensionImporter", + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_76_dst.uast b/uast/diff/testdata/testcase_76_dst.uast new file mode 100644 index 00000000..84ef5cb3 --- /dev/null +++ b/uast/diff/testdata/testcase_76_dst.uast @@ -0,0 +1,1130 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 10, + line: 1, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 34, + line: 4, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 34, + line: 4, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 37, + line: 4, + col: 4, + }, + }, + Name: "mod", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 40, + line: 4, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 47, + line: 4, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 55, + line: 4, + col: 22, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 40, + line: 4, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 46, + line: 4, + col: 13, + }, + }, + Name: "Module", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 5, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 5, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 61, + line: 5, + col: 5, + }, + }, + Name: "mod2", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 64, + line: 5, + col: 8, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 71, + line: 5, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 79, + line: 5, + col: 23, + }, + }, + Name: "__name__", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 81, + line: 5, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 91, + line: 5, + col: 35, + }, + }, + Format: "", + Value: "testmod2", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 64, + line: 5, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 70, + line: 5, + col: 14, + }, + }, + Name: "Module", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 94, + line: 7, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 94, + line: 7, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 97, + line: 7, + col: 4, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 100, + line: 7, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 106, + line: 7, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 114, + line: 7, + col: 21, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 100, + line: 7, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 105, + line: 7, + col: 12, + }, + }, + Name: "Flask", + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 116, + line: 8, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 116, + line: 8, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 136, + line: 8, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 139, + line: 8, + col: 24, + }, + }, + Name: "mod", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 117, + line: 8, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 120, + line: 8, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 116, + line: 8, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 119, + line: 8, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 116, + line: 8, + col: 1, + }, + }, + Name: "register_module", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 141, + line: 9, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 141, + line: 9, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 161, + line: 9, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 165, + line: 9, + col: 25, + }, + }, + Name: "mod2", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 142, + line: 9, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 145, + line: 9, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 141, + line: 9, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 144, + line: 9, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 141, + line: 9, + col: 1, + }, + }, + Name: "register_module", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 173, + line: 12, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 183, + line: 12, + col: 15, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "handle_404", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 196, + line: 13, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 202, + line: 13, + col: 11, + }, + }, + value: { '@type': "Tuple", + '@role': [Expression, Literal, Primitive, Tuple], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 203, + line: 13, + col: 12, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 203, + line: 13, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 212, + line: 13, + col: 21, + }, + }, + Format: "", + Value: "Testing", + }, + { '@type': "Num", + '@token': 404, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 214, + line: 13, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 217, + line: 13, + col: 26, + }, + }, + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 184, + line: 12, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 189, + line: 12, + col: 21, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 184, + line: 12, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 189, + line: 12, + col: 21, + }, + }, + Name: "error", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 218, + line: 14, + col: 1, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 218, + line: 14, + col: 1, + }, + }, + ctx: "Store", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "Num", + '@token': 404, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 237, + line: 14, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 240, + line: 14, + col: 23, + }, + }, + }, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 219, + line: 14, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 222, + line: 14, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 218, + line: 14, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 221, + line: 14, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 218, + line: 14, + col: 1, + }, + }, + Name: "error_handlers", + }, + ], + }, + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 244, + line: 14, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 254, + line: 14, + col: 37, + }, + }, + Name: "handle_404", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 262, + line: 17, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 275, + line: 17, + col: 19, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "after_request", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 309, + line: 19, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 309, + line: 19, + col: 5, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 310, + line: 19, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 311, + line: 19, + col: 7, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 309, + line: 19, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 310, + line: 19, + col: 6, + }, + }, + Name: "g", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 311, + line: 19, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 313, + line: 19, + col: 9, + }, + }, + Name: "db", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 309, + line: 19, + col: 5, + }, + }, + Name: "close", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 326, + line: 20, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 332, + line: 20, + col: 11, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 333, + line: 20, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 341, + line: 20, + col: 20, + }, + }, + Name: "response", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 294, + line: 18, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 302, + line: 18, + col: 27, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 294, + line: 18, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 302, + line: 18, + col: 27, + }, + }, + Name: "response", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 344, + line: 23, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 377, + line: 25, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 383, + line: 25, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 384, + line: 25, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 400, + line: 25, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 417, + line: 25, + col: 45, + }, + }, + Format: "", + Value: "test/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 384, + line: 25, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 399, + line: 25, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 421, + line: 28, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 455, + line: 30, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 461, + line: 30, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 462, + line: 30, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 478, + line: 30, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 499, + line: 30, + col: 49, + }, + }, + Format: "", + Value: "testmod2/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 462, + line: 30, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 477, + line: 30, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 503, + line: 33, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 537, + line: 35, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 543, + line: 35, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 544, + line: 35, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 560, + line: 35, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 587, + line: 35, + col: 55, + }, + }, + Format: "", + Value: "something-else/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 544, + line: 35, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 559, + line: 35, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_76_src.uast b/uast/diff/testdata/testcase_76_src.uast new file mode 100644 index 00000000..fb3fd575 --- /dev/null +++ b/uast/diff/testdata/testcase_76_src.uast @@ -0,0 +1,897 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 10, + line: 1, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 34, + line: 4, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 34, + line: 4, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 37, + line: 4, + col: 4, + }, + }, + Name: "mod", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 40, + line: 4, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 47, + line: 4, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 55, + line: 4, + col: 22, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 40, + line: 4, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 46, + line: 4, + col: 13, + }, + }, + Name: "Module", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 5, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 5, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 61, + line: 5, + col: 5, + }, + }, + Name: "mod2", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 64, + line: 5, + col: 8, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 71, + line: 5, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 79, + line: 5, + col: 23, + }, + }, + Name: "__name__", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 81, + line: 5, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 91, + line: 5, + col: 35, + }, + }, + Format: "", + Value: "testmod2", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 64, + line: 5, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 70, + line: 5, + col: 14, + }, + }, + Name: "Module", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 94, + line: 7, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 94, + line: 7, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 97, + line: 7, + col: 4, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 100, + line: 7, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 106, + line: 7, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 114, + line: 7, + col: 21, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 100, + line: 7, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 105, + line: 7, + col: 12, + }, + }, + Name: "Flask", + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 116, + line: 8, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 116, + line: 8, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 136, + line: 8, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 139, + line: 8, + col: 24, + }, + }, + Name: "mod", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 117, + line: 8, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 120, + line: 8, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 116, + line: 8, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 119, + line: 8, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 116, + line: 8, + col: 1, + }, + }, + Name: "register_module", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 141, + line: 9, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 141, + line: 9, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 161, + line: 9, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 165, + line: 9, + col: 25, + }, + }, + Name: "mod2", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 142, + line: 9, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 145, + line: 9, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 141, + line: 9, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 144, + line: 9, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 141, + line: 9, + col: 1, + }, + }, + Name: "register_module", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 174, + line: 12, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 187, + line: 12, + col: 19, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "after_request", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 221, + line: 14, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 221, + line: 14, + col: 5, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 222, + line: 14, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 223, + line: 14, + col: 7, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 221, + line: 14, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 222, + line: 14, + col: 6, + }, + }, + Name: "g", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 223, + line: 14, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 225, + line: 14, + col: 9, + }, + }, + Name: "db", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 221, + line: 14, + col: 5, + }, + }, + Name: "close", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 238, + line: 15, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 244, + line: 15, + col: 11, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 245, + line: 15, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 253, + line: 15, + col: 20, + }, + }, + Name: "response", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 206, + line: 13, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 214, + line: 13, + col: 27, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 206, + line: 13, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 214, + line: 13, + col: 27, + }, + }, + Name: "response", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 256, + line: 18, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 289, + line: 20, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 295, + line: 20, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 296, + line: 20, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 312, + line: 20, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 329, + line: 20, + col: 45, + }, + }, + Format: "", + Value: "test/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 296, + line: 20, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 311, + line: 20, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 333, + line: 23, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 367, + line: 25, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 373, + line: 25, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 25, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 390, + line: 25, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 411, + line: 25, + col: 49, + }, + }, + Format: "", + Value: "testmod2/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 25, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 389, + line: 25, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 415, + line: 28, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 449, + line: 30, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 455, + line: 30, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 456, + line: 30, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 472, + line: 30, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 499, + line: 30, + col: 55, + }, + }, + Format: "", + Value: "something-else/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 456, + line: 30, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 471, + line: 30, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_77_dst.uast b/uast/diff/testdata/testcase_77_dst.uast new file mode 100644 index 00000000..a95fa1cf --- /dev/null +++ b/uast/diff/testdata/testcase_77_dst.uast @@ -0,0 +1,1088 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 242, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 245, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask.session\n ~~~~~~~~~~~~~\n\n Implements cookie based sessions based on Werkzeug's secure cookie\n system.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 247, + line: 13, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "SecureCookie", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.contrib.securecookie", + }, + Target: ~, + }, + { '@type': "ClassDef", + '@token': "Session", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 310, + line: 16, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 317, + line: 16, + col: 14, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 318, + line: 16, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 330, + line: 16, + col: 27, + }, + }, + Name: "SecureCookie", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 437, + line: 19, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 337, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 444, + line: 19, + col: 8, + }, + }, + Format: "", + Value: "Expands the session with support for switching between permanent\n and non-permanent sessions.\n ", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 454, + line: 21, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 468, + line: 21, + col: 23, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_get_permanent", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 484, + line: 22, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 490, + line: 22, + col: 15, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 491, + line: 22, + col: 16, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 500, + line: 22, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 512, + line: 22, + col: 37, + }, + }, + Format: "", + Value: "_permanent", + }, + { '@type': "BoolLiteral", + '@token': "False", + '@role': [Argument, Boolean, Call, Expression, Function, Literal, Name, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 514, + line: 22, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 519, + line: 22, + col: 44, + }, + }, + value: false, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 492, + line: 22, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 496, + line: 22, + col: 21, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 491, + line: 22, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 495, + line: 22, + col: 20, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 491, + line: 22, + col: 16, + }, + }, + Name: "get", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 469, + line: 21, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 473, + line: 21, + col: 28, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 469, + line: 21, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 473, + line: 21, + col: 28, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 530, + line: 24, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 544, + line: 24, + col: 23, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_set_permanent", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 567, + line: 25, + col: 9, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 567, + line: 25, + col: 9, + }, + }, + ctx: "Store", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 572, + line: 25, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 584, + line: 25, + col: 26, + }, + }, + Format: "", + Value: "_permanent", + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 567, + line: 25, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 571, + line: 25, + col: 13, + }, + }, + Name: "self", + }, + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 588, + line: 25, + col: 30, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 593, + line: 25, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 598, + line: 25, + col: 40, + }, + }, + Name: "value", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 588, + line: 25, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 592, + line: 25, + col: 34, + }, + }, + Name: "bool", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 545, + line: 24, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 549, + line: 24, + col: 28, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 545, + line: 24, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 549, + line: 24, + col: 28, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 551, + line: 24, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 556, + line: 24, + col: 35, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 551, + line: 24, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 556, + line: 24, + col: 35, + }, + }, + Name: "value", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 605, + line: 27, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 605, + line: 27, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 614, + line: 27, + col: 14, + }, + }, + Name: "permanent", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 617, + line: 27, + col: 17, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 626, + line: 27, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 640, + line: 27, + col: 40, + }, + }, + Name: "_get_permanent", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 642, + line: 27, + col: 42, + }, + end: { '@type': "uast:Position", + offset: 656, + line: 27, + col: 56, + }, + }, + Name: "_set_permanent", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 617, + line: 27, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 625, + line: 27, + col: 25, + }, + }, + Name: "property", + }, + keywords: [], + }, + }, + { '@type': "Delete", + '@token': "del", + '@role': [Incomplete, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 662, + line: 28, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 665, + line: 28, + col: 8, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 666, + line: 28, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 680, + line: 28, + col: 23, + }, + }, + Name: "_get_permanent", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 682, + line: 28, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 696, + line: 28, + col: 39, + }, + }, + Name: "_set_permanent", + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "ClassDef", + '@token': "_NullSession", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 705, + line: 31, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 717, + line: 31, + col: 19, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 718, + line: 31, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 725, + line: 31, + col: 27, + }, + }, + Name: "Session", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 895, + line: 35, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 732, + line: 32, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 902, + line: 35, + col: 8, + }, + }, + Format: "", + Value: "Class used to generate nicer error messages if sessions are not\n available. Will still allow read-only access to the empty session\n but fail on setting.\n ", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 912, + line: 37, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 917, + line: 37, + col: 14, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_fail", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Raise", + '@token': "raise", + '@role': [Statement, Throw], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 950, + line: 38, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 955, + line: 38, + col: 14, + }, + }, + cause: ~, + exc: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 956, + line: 38, + col: 15, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 969, + line: 38, + col: 28, + }, + }, + Format: "", + Value: "the session is unavailable because no secret key was set. Set the secret_key on the application to something unique and secret", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 956, + line: 38, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 968, + line: 38, + col: 27, + }, + }, + Name: "RuntimeError", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 918, + line: 37, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 922, + line: 37, + col: 19, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 918, + line: 37, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 922, + line: 37, + col: 19, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 933, + line: 37, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 939, + line: 37, + col: 36, + }, + }, + Init: ~, + MapVariadic: true, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 933, + line: 37, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 939, + line: 37, + col: 36, + }, + }, + Name: "kwargs", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 925, + line: 37, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 929, + line: 37, + col: 26, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 925, + line: 37, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 929, + line: 37, + col: 26, + }, + }, + Name: "args", + }, + Receiver: false, + Type: ~, + Variadic: true, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1164, + line: 41, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1164, + line: 41, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1175, + line: 41, + col: 16, + }, + }, + Name: "__setitem__", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1178, + line: 41, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 1189, + line: 41, + col: 30, + }, + }, + Name: "__delitem__", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1192, + line: 41, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 1197, + line: 41, + col: 38, + }, + }, + Name: "clear", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1200, + line: 41, + col: 41, + }, + end: { '@type': "uast:Position", + offset: 1203, + line: 41, + col: 44, + }, + }, + Name: "pop", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1206, + line: 41, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 1213, + line: 41, + col: 54, + }, + }, + Name: "popitem", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1226, + line: 42, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1232, + line: 42, + col: 15, + }, + }, + Name: "update", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1235, + line: 42, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 1245, + line: 42, + col: 28, + }, + }, + Name: "setdefault", + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1248, + line: 42, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 1253, + line: 42, + col: 36, + }, + }, + Name: "_fail", + }, + }, + { '@type': "Delete", + '@token': "del", + '@role': [Incomplete, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1258, + line: 43, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1261, + line: 43, + col: 8, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1262, + line: 43, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1267, + line: 43, + col: 14, + }, + }, + Name: "_fail", + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_77_src.uast b/uast/diff/testdata/testcase_77_src.uast new file mode 100644 index 00000000..3117b6d5 --- /dev/null +++ b/uast/diff/testdata/testcase_77_src.uast @@ -0,0 +1,1062 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "SecureCookie", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.contrib.securecookie", + }, + Target: ~, + }, + { '@type': "ClassDef", + '@token': "Session", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 63, + line: 4, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 70, + line: 4, + col: 14, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 71, + line: 4, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 83, + line: 4, + col: 27, + }, + }, + Name: "SecureCookie", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 190, + line: 7, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 90, + line: 5, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 197, + line: 7, + col: 8, + }, + }, + Format: "", + Value: "Expands the session with support for switching between permanent\n and non-permanent sessions.\n ", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 207, + line: 9, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 221, + line: 9, + col: 23, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_get_permanent", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 237, + line: 10, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 243, + line: 10, + col: 15, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 244, + line: 10, + col: 16, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 253, + line: 10, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 265, + line: 10, + col: 37, + }, + }, + Format: "", + Value: "_permanent", + }, + { '@type': "BoolLiteral", + '@token': "False", + '@role': [Argument, Boolean, Call, Expression, Function, Literal, Name, Positional, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 267, + line: 10, + col: 39, + }, + end: { '@type': "uast:Position", + offset: 272, + line: 10, + col: 44, + }, + }, + value: false, + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 245, + line: 10, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 249, + line: 10, + col: 21, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 244, + line: 10, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 248, + line: 10, + col: 20, + }, + }, + Name: "self", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 244, + line: 10, + col: 16, + }, + }, + Name: "get", + }, + ], + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 222, + line: 9, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 226, + line: 9, + col: 28, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 222, + line: 9, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 226, + line: 9, + col: 28, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 283, + line: 12, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 297, + line: 12, + col: 23, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_set_permanent", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 320, + line: 13, + col: 9, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 320, + line: 13, + col: 9, + }, + }, + ctx: "Store", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 325, + line: 13, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 337, + line: 13, + col: 26, + }, + }, + Format: "", + Value: "_permanent", + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 320, + line: 13, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 324, + line: 13, + col: 13, + }, + }, + Name: "self", + }, + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 341, + line: 13, + col: 30, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 346, + line: 13, + col: 35, + }, + end: { '@type': "uast:Position", + offset: 351, + line: 13, + col: 40, + }, + }, + Name: "value", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 341, + line: 13, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 345, + line: 13, + col: 34, + }, + }, + Name: "bool", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 298, + line: 12, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 302, + line: 12, + col: 28, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 298, + line: 12, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 302, + line: 12, + col: 28, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 304, + line: 12, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 309, + line: 12, + col: 35, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 304, + line: 12, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 309, + line: 12, + col: 35, + }, + }, + Name: "value", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 358, + line: 15, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 358, + line: 15, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 367, + line: 15, + col: 14, + }, + }, + Name: "permanent", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 370, + line: 15, + col: 17, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 379, + line: 15, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 393, + line: 15, + col: 40, + }, + }, + Name: "_get_permanent", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 395, + line: 15, + col: 42, + }, + end: { '@type': "uast:Position", + offset: 409, + line: 15, + col: 56, + }, + }, + Name: "_set_permanent", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 370, + line: 15, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 378, + line: 15, + col: 25, + }, + }, + Name: "property", + }, + keywords: [], + }, + }, + { '@type': "Delete", + '@token': "del", + '@role': [Incomplete, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 415, + line: 16, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 418, + line: 16, + col: 8, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 419, + line: 16, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 433, + line: 16, + col: 23, + }, + }, + Name: "_get_permanent", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 435, + line: 16, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 449, + line: 16, + col: 39, + }, + }, + Name: "_set_permanent", + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "ClassDef", + '@token': "_NullSession", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 458, + line: 19, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 470, + line: 19, + col: 19, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 471, + line: 19, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 478, + line: 19, + col: 27, + }, + }, + Name: "Session", + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 648, + line: 23, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 485, + line: 20, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 655, + line: 23, + col: 8, + }, + }, + Format: "", + Value: "Class used to generate nicer error messages if sessions are not\n available. Will still allow read-only access to the empty session\n but fail on setting.\n ", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 665, + line: 25, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 670, + line: 25, + col: 14, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_fail", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Raise", + '@token': "raise", + '@role': [Statement, Throw], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 703, + line: 26, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 708, + line: 26, + col: 14, + }, + }, + cause: ~, + exc: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 709, + line: 26, + col: 15, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 722, + line: 26, + col: 28, + }, + }, + Format: "", + Value: "the session is unavailable because no secret key was set. Set the secret_key on the application to something unique and secret", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 709, + line: 26, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 721, + line: 26, + col: 27, + }, + }, + Name: "RuntimeError", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 671, + line: 25, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 675, + line: 25, + col: 19, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 671, + line: 25, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 675, + line: 25, + col: 19, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 686, + line: 25, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 692, + line: 25, + col: 36, + }, + }, + Init: ~, + MapVariadic: true, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 686, + line: 25, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 692, + line: 25, + col: 36, + }, + }, + Name: "kwargs", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 678, + line: 25, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 682, + line: 25, + col: 26, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 678, + line: 25, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 682, + line: 25, + col: 26, + }, + }, + Name: "args", + }, + Receiver: false, + Type: ~, + Variadic: true, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 917, + line: 29, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 917, + line: 29, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 928, + line: 29, + col: 16, + }, + }, + Name: "__setitem__", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 931, + line: 29, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 942, + line: 29, + col: 30, + }, + }, + Name: "__delitem__", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 945, + line: 29, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 950, + line: 29, + col: 38, + }, + }, + Name: "clear", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 953, + line: 29, + col: 41, + }, + end: { '@type': "uast:Position", + offset: 956, + line: 29, + col: 44, + }, + }, + Name: "pop", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 959, + line: 29, + col: 47, + }, + end: { '@type': "uast:Position", + offset: 966, + line: 29, + col: 54, + }, + }, + Name: "popitem", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 979, + line: 30, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 985, + line: 30, + col: 15, + }, + }, + Name: "update", + }, + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 988, + line: 30, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 998, + line: 30, + col: 28, + }, + }, + Name: "setdefault", + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1001, + line: 30, + col: 31, + }, + end: { '@type': "uast:Position", + offset: 1006, + line: 30, + col: 36, + }, + }, + Name: "_fail", + }, + }, + { '@type': "Delete", + '@token': "del", + '@role': [Incomplete, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1011, + line: 31, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1014, + line: 31, + col: 8, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1015, + line: 31, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 1020, + line: 31, + col: 14, + }, + }, + Name: "_fail", + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_78_dst.uast b/uast/diff/testdata/testcase_78_dst.uast new file mode 100644 index 00000000..d23ded90 --- /dev/null +++ b/uast/diff/testdata/testcase_78_dst.uast @@ -0,0 +1,999 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 244, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 247, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n tests.subclassing\n ~~~~~~~~~~~~~~~~~\n\n Test that certain behavior of flask can be customized by\n subclasses.\n\n :copyright: (c) 2015 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 249, + line: 13, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flask", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 248, + line: 12, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 248, + line: 12, + col: 1, + }, + }, + lines: [], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 263, + line: 15, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "StringIO", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask._compat", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 304, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 337, + line: 18, + col: 38, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "test_suppressed_exception_logging", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "ClassDef", + '@token': "SuppressedFlask", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 351, + line: 19, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 366, + line: 19, + col: 26, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 368, + line: 19, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 373, + line: 19, + col: 33, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 367, + line: 19, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 372, + line: 19, + col: 32, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 367, + line: 19, + col: 27, + }, + }, + Name: "Flask", + }, + ], + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 393, + line: 20, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 406, + line: 20, + col: 26, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "log_exception", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Pass", + '@token': "pass", + '@role': [Noop, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 436, + line: 21, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 440, + line: 21, + col: 17, + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 407, + line: 20, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 411, + line: 20, + col: 31, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 407, + line: 20, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 411, + line: 20, + col: 31, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 413, + line: 20, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 421, + line: 20, + col: 41, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 413, + line: 20, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 421, + line: 20, + col: 41, + }, + }, + Name: "exc_info", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 23, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 23, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 449, + line: 23, + col: 8, + }, + }, + Name: "out", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 452, + line: 23, + col: 11, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 452, + line: 23, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 460, + line: 23, + col: 19, + }, + }, + Name: "StringIO", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 467, + line: 24, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 467, + line: 24, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 470, + line: 24, + col: 8, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 473, + line: 24, + col: 11, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 489, + line: 24, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 497, + line: 24, + col: 35, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 473, + line: 24, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 488, + line: 24, + col: 26, + }, + }, + Name: "SuppressedFlask", + }, + keywords: [], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 504, + line: 26, + col: 5, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Raise", + '@token': "raise", + '@role': [Statement, Throw], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 545, + line: 28, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 550, + line: 28, + col: 14, + }, + }, + cause: ~, + exc: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 551, + line: 28, + col: 15, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 561, + line: 28, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 567, + line: 28, + col: 31, + }, + }, + Format: "", + Value: "test", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 551, + line: 28, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 560, + line: 28, + col: 24, + }, + }, + Name: "Exception", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 574, + line: 30, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 574, + line: 30, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 576, + line: 30, + col: 7, + }, + }, + Name: "rv", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 579, + line: 30, + col: 10, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 601, + line: 30, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 604, + line: 30, + col: 35, + }, + }, + Format: "", + Value: "/", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 580, + line: 30, + col: 11, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 579, + line: 30, + col: 10, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 580, + line: 30, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 583, + line: 30, + col: 14, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 579, + line: 30, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 582, + line: 30, + col: 13, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 579, + line: 30, + col: 10, + }, + }, + Name: "test_client", + }, + ], + }, + keywords: [], + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 579, + line: 30, + col: 10, + }, + }, + Name: "get", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "errors_stream", + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 620, + line: 30, + col: 51, + }, + end: { '@type': "uast:Position", + offset: 623, + line: 30, + col: 54, + }, + }, + Name: "out", + }, + }, + ], + }, + }, + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 629, + line: 31, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 635, + line: 31, + col: 11, + }, + }, + msg: ~, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 636, + line: 31, + col: 12, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "Num", + '@token': 500, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 654, + line: 31, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 657, + line: 31, + col: 33, + }, + }, + }, + ], + }, + left: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 637, + line: 31, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 639, + line: 31, + col: 15, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 636, + line: 31, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 638, + line: 31, + col: 14, + }, + }, + Name: "rv", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 636, + line: 31, + col: 12, + }, + }, + Name: "status_code", + }, + ], + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 662, + line: 32, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 668, + line: 32, + col: 11, + }, + }, + msg: ~, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 669, + line: 32, + col: 12, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 698, + line: 32, + col: 41, + }, + end: { '@type': "uast:Position", + offset: 700, + line: 32, + col: 43, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 697, + line: 32, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 699, + line: 32, + col: 42, + }, + }, + Name: "rv", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 697, + line: 32, + col: 40, + }, + }, + Name: "data", + }, + ], + }, + ], + }, + left: { '@type': "uast:String", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 669, + line: 32, + col: 12, + }, + }, + Format: "", + Value: "Internal Server Error", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "In", + '@token': "in", + '@role': [Contains, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 709, + line: 33, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 715, + line: 33, + col: 11, + }, + }, + msg: ~, + test: { '@type': "UnaryOp", + '@role': [Boolean, Expression, Operator, Unary], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 716, + line: 33, + col: 12, + }, + }, + op: { '@type': "Not", + '@token': "not", + '@role': [Boolean, Not, Operator], + '@pos': { '@type': "uast:Positions", + }, + }, + operand: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 720, + line: 33, + col: 16, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 721, + line: 33, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 724, + line: 33, + col: 20, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 720, + line: 33, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 723, + line: 33, + col: 19, + }, + }, + Name: "out", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 720, + line: 33, + col: 16, + }, + }, + Name: "getvalue", + }, + ], + }, + keywords: [], + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_78_src.uast b/uast/diff/testdata/testcase_78_src.uast new file mode 100644 index 00000000..d75a9afc --- /dev/null +++ b/uast/diff/testdata/testcase_78_src.uast @@ -0,0 +1,1266 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 244, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 247, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n tests.subclassing\n ~~~~~~~~~~~~~~~~~\n\n Test that certain behavior of flask can be customized by\n subclasses.\n\n :copyright: (c) 2015 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 248, + line: 12, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flask", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 261, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 273, + line: 13, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "StreamHandler", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "logging", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 296, + line: 15, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "StringIO", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask._compat", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 337, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 370, + line: 18, + col: 38, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "test_suppressed_exception_logging", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "ClassDef", + '@token': "SuppressedFlask", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 384, + line: 19, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 399, + line: 19, + col: 26, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 401, + line: 19, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 406, + line: 19, + col: 33, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 400, + line: 19, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 405, + line: 19, + col: 32, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 400, + line: 19, + col: 27, + }, + }, + Name: "Flask", + }, + ], + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 426, + line: 20, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 439, + line: 20, + col: 26, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "log_exception", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Pass", + '@token': "pass", + '@role': [Noop, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 469, + line: 21, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 473, + line: 21, + col: 17, + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 440, + line: 20, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 444, + line: 20, + col: 31, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 440, + line: 20, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 444, + line: 20, + col: 31, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 20, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 454, + line: 20, + col: 41, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 20, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 454, + line: 20, + col: 41, + }, + }, + Name: "exc_info", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 479, + line: 23, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 479, + line: 23, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 482, + line: 23, + col: 8, + }, + }, + Name: "out", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 485, + line: 23, + col: 11, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 485, + line: 23, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 493, + line: 23, + col: 19, + }, + }, + Name: "StringIO", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 500, + line: 24, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 500, + line: 24, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 503, + line: 24, + col: 8, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 506, + line: 24, + col: 11, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 522, + line: 24, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 530, + line: 24, + col: 35, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 506, + line: 24, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 521, + line: 24, + col: 26, + }, + }, + Name: "SuppressedFlask", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 536, + line: 25, + col: 5, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 537, + line: 25, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 540, + line: 25, + col: 9, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 536, + line: 25, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 539, + line: 25, + col: 8, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 536, + line: 25, + col: 5, + }, + }, + Name: "logger_name", + }, + ], + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 554, + line: 25, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 601, + line: 25, + col: 70, + }, + }, + Format: "", + Value: "flask_tests/test_suppressed_exception_logging", + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 606, + line: 26, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 606, + line: 26, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 628, + line: 26, + col: 27, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 642, + line: 26, + col: 41, + }, + end: { '@type': "uast:Position", + offset: 645, + line: 26, + col: 44, + }, + }, + Name: "out", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 628, + line: 26, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 641, + line: 26, + col: 40, + }, + }, + Name: "StreamHandler", + }, + keywords: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 607, + line: 26, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 610, + line: 26, + col: 9, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 606, + line: 26, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 609, + line: 26, + col: 8, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 610, + line: 26, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 616, + line: 26, + col: 15, + }, + }, + Name: "logger", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 606, + line: 26, + col: 5, + }, + }, + Name: "addHandler", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 653, + line: 28, + col: 5, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 694, + line: 30, + col: 9, + }, + }, + value: { '@type': "BinOp", + '@role': [Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 694, + line: 30, + col: 9, + }, + }, + left: { '@type': "Num", + '@token': 1, + '@role': [Binary, Expression, Left, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 694, + line: 30, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 695, + line: 30, + col: 10, + }, + }, + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 648, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 648, + line: 27, + col: 1, + }, + }, + lines: [], + }, + }, + op: { '@type': "FloorDiv", + '@token': "//", + '@role': [Arithmetic, Binary, Divide, Incomplete, Operator], + '@pos': { '@type': "uast:Positions", + }, + }, + right: { '@type': "Num", + '@token': 0, + '@role': [Binary, Expression, Literal, Number, Primitive, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 699, + line: 30, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 700, + line: 30, + col: 15, + }, + }, + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 706, + line: 32, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 706, + line: 32, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 708, + line: 32, + col: 7, + }, + }, + Name: "rv", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 711, + line: 32, + col: 10, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 733, + line: 32, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 736, + line: 32, + col: 35, + }, + }, + Format: "", + Value: "/", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 712, + line: 32, + col: 11, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 711, + line: 32, + col: 10, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 712, + line: 32, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 715, + line: 32, + col: 14, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 711, + line: 32, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 714, + line: 32, + col: 13, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 711, + line: 32, + col: 10, + }, + }, + Name: "test_client", + }, + ], + }, + keywords: [], + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 711, + line: 32, + col: 10, + }, + }, + Name: "get", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 742, + line: 33, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 748, + line: 33, + col: 11, + }, + }, + msg: ~, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 749, + line: 33, + col: 12, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "Num", + '@token': 500, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 767, + line: 33, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 770, + line: 33, + col: 33, + }, + }, + }, + ], + }, + left: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 750, + line: 33, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 752, + line: 33, + col: 15, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 749, + line: 33, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 751, + line: 33, + col: 14, + }, + }, + Name: "rv", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 749, + line: 33, + col: 12, + }, + }, + Name: "status_code", + }, + ], + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 775, + line: 34, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 781, + line: 34, + col: 11, + }, + }, + msg: ~, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 782, + line: 34, + col: 12, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 811, + line: 34, + col: 41, + }, + end: { '@type': "uast:Position", + offset: 813, + line: 34, + col: 43, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 810, + line: 34, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 812, + line: 34, + col: 42, + }, + }, + Name: "rv", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 810, + line: 34, + col: 40, + }, + }, + Name: "data", + }, + ], + }, + ], + }, + left: { '@type': "uast:String", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 782, + line: 34, + col: 12, + }, + }, + Format: "", + Value: "Internal Server Error", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "In", + '@token': "in", + '@role': [Contains, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 823, + line: 36, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 823, + line: 36, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 826, + line: 36, + col: 8, + }, + }, + Name: "err", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 829, + line: 36, + col: 11, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 830, + line: 36, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 833, + line: 36, + col: 15, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 829, + line: 36, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 832, + line: 36, + col: 14, + }, + }, + Name: "out", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 829, + line: 36, + col: 11, + }, + }, + Name: "getvalue", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 848, + line: 37, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 854, + line: 37, + col: 11, + }, + }, + msg: ~, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 855, + line: 37, + col: 12, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 862, + line: 37, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 864, + line: 37, + col: 21, + }, + }, + Format: "", + Value: "", + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 855, + line: 37, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 858, + line: 37, + col: 15, + }, + }, + Name: "err", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_79_dst.uast b/uast/diff/testdata/testcase_79_dst.uast new file mode 100644 index 00000000..82d91a6d --- /dev/null +++ b/uast/diff/testdata/testcase_79_dst.uast @@ -0,0 +1,533 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 15, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 387, + line: 15, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 411, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 422, + line: 16, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 455, + line: 18, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 488, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 500, + line: 19, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 515, + line: 20, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 528, + line: 20, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 681, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 694, + line: 23, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 755, + line: 24, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 767, + line: 24, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 782, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 798, + line: 25, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 861, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 874, + line: 28, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1022, + line: 32, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1024, + line: 32, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1045, + line: 33, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1058, + line: 33, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1025, + line: 32, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1039, + line: 32, + col: 18, + }, + }, + Name: "json_available", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_79_src.uast b/uast/diff/testdata/testcase_79_src.uast new file mode 100644 index 00000000..7772ebc3 --- /dev/null +++ b/uast/diff/testdata/testcase_79_src.uast @@ -0,0 +1,472 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 15, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 387, + line: 15, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 411, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 422, + line: 16, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 455, + line: 18, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 488, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 500, + line: 19, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 515, + line: 20, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 528, + line: 20, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 681, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 694, + line: 23, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 755, + line: 24, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 767, + line: 24, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 782, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 798, + line: 25, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 884, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 886, + line: 28, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 907, + line: 29, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 920, + line: 29, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 887, + line: 28, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 901, + line: 28, + col: 18, + }, + }, + Name: "json_available", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_7_dst.uast b/uast/diff/testdata/testcase_7_dst.uast new file mode 100644 index 00000000..be0932b1 --- /dev/null +++ b/uast/diff/testdata/testcase_7_dst.uast @@ -0,0 +1,152 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 10, + line: 1, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 27, + line: 4, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 27, + line: 4, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 30, + line: 4, + col: 4, + }, + }, + Name: "mod", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 33, + line: 4, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 40, + line: 4, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 48, + line: 4, + col: 22, + }, + }, + Name: "__name__", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 50, + line: 4, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 55, + line: 4, + col: 29, + }, + }, + Format: "", + Value: "foo", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 33, + line: 4, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 39, + line: 4, + col: 13, + }, + }, + Name: "Module", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "subdomain", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 67, + line: 4, + col: 41, + }, + end: { '@type': "uast:Position", + offset: 72, + line: 4, + col: 46, + }, + }, + Format: "", + Value: "foo", + }, + }, + ], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_7_src.uast b/uast/diff/testdata/testcase_7_src.uast new file mode 100644 index 00000000..be0932b1 --- /dev/null +++ b/uast/diff/testdata/testcase_7_src.uast @@ -0,0 +1,152 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 10, + line: 1, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 27, + line: 4, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 27, + line: 4, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 30, + line: 4, + col: 4, + }, + }, + Name: "mod", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 33, + line: 4, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 40, + line: 4, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 48, + line: 4, + col: 22, + }, + }, + Name: "__name__", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 50, + line: 4, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 55, + line: 4, + col: 29, + }, + }, + Format: "", + Value: "foo", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 33, + line: 4, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 39, + line: 4, + col: 13, + }, + }, + Name: "Module", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "subdomain", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 67, + line: 4, + col: 41, + }, + end: { '@type': "uast:Position", + offset: 72, + line: 4, + col: 46, + }, + }, + Format: "", + Value: "foo", + }, + }, + ], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_80_dst.uast b/uast/diff/testdata/testcase_80_dst.uast new file mode 100644 index 00000000..b47cbf0f --- /dev/null +++ b/uast/diff/testdata/testcase_80_dst.uast @@ -0,0 +1,562 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 15, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 387, + line: 15, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 411, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 422, + line: 16, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 455, + line: 18, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 488, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 500, + line: 19, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 515, + line: 20, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 528, + line: 20, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 681, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 694, + line: 23, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 755, + line: 24, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 767, + line: 24, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 782, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 798, + line: 25, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 846, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 859, + line: 26, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Session", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../session", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 890, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 903, + line: 29, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1051, + line: 33, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1053, + line: 33, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1074, + line: 34, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1087, + line: 34, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1054, + line: 33, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1068, + line: 33, + col: 18, + }, + }, + Name: "json_available", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_80_src.uast b/uast/diff/testdata/testcase_80_src.uast new file mode 100644 index 00000000..82d91a6d --- /dev/null +++ b/uast/diff/testdata/testcase_80_src.uast @@ -0,0 +1,533 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 15, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 387, + line: 15, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 411, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 422, + line: 16, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 455, + line: 18, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 488, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 500, + line: 19, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 515, + line: 20, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 528, + line: 20, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 681, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 694, + line: 23, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 755, + line: 24, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 767, + line: 24, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 782, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 798, + line: 25, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 861, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 874, + line: 28, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1022, + line: 32, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1024, + line: 32, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1045, + line: 33, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1058, + line: 33, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1025, + line: 32, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1039, + line: 32, + col: 18, + }, + }, + Name: "json_available", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_81_dst.uast b/uast/diff/testdata/testcase_81_dst.uast new file mode 100644 index 00000000..5e818efc --- /dev/null +++ b/uast/diff/testdata/testcase_81_dst.uast @@ -0,0 +1,591 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 15, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 387, + line: 15, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 411, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 422, + line: 16, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 455, + line: 18, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 488, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 500, + line: 19, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 515, + line: 20, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 528, + line: 20, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 681, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 694, + line: 23, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 755, + line: 24, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 764, + line: 24, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 792, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 804, + line: 25, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 819, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 835, + line: 26, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 883, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 896, + line: 27, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Session", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../session", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 927, + line: 30, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 940, + line: 30, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1088, + line: 34, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1090, + line: 34, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1111, + line: 35, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1124, + line: 35, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1091, + line: 34, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1105, + line: 34, + col: 18, + }, + }, + Name: "json_available", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_81_src.uast b/uast/diff/testdata/testcase_81_src.uast new file mode 100644 index 00000000..b47cbf0f --- /dev/null +++ b/uast/diff/testdata/testcase_81_src.uast @@ -0,0 +1,562 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 15, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 387, + line: 15, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 411, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 422, + line: 16, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 455, + line: 18, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 488, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 500, + line: 19, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 515, + line: 20, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 528, + line: 20, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 681, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 694, + line: 23, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 755, + line: 24, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 767, + line: 24, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 782, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 798, + line: 25, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 846, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 859, + line: 26, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Session", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../session", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 890, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 903, + line: 29, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1051, + line: 33, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1053, + line: 33, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1074, + line: 34, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1087, + line: 34, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1054, + line: 33, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1068, + line: 33, + col: 18, + }, + }, + Name: "json_available", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_82_dst.uast b/uast/diff/testdata/testcase_82_dst.uast new file mode 100644 index 00000000..da360845 --- /dev/null +++ b/uast/diff/testdata/testcase_82_dst.uast @@ -0,0 +1,607 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 15, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 387, + line: 15, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 411, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 422, + line: 16, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 455, + line: 18, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 488, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 500, + line: 19, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 515, + line: 20, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 528, + line: 20, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 692, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 705, + line: 23, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 766, + line: 24, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 775, + line: 24, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 803, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 815, + line: 25, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 830, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 846, + line: 26, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 894, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 907, + line: 27, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Session", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../session", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 938, + line: 30, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 951, + line: 30, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1121, + line: 34, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1123, + line: 34, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1144, + line: 35, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1157, + line: 35, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1124, + line: 34, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1138, + line: 34, + col: 18, + }, + }, + Name: "json_available", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_82_src.uast b/uast/diff/testdata/testcase_82_src.uast new file mode 100644 index 00000000..5e818efc --- /dev/null +++ b/uast/diff/testdata/testcase_82_src.uast @@ -0,0 +1,591 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 15, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 387, + line: 15, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 411, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 422, + line: 16, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 455, + line: 18, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 488, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 500, + line: 19, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 515, + line: 20, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 528, + line: 20, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 681, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 694, + line: 23, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 755, + line: 24, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 764, + line: 24, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 792, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 804, + line: 25, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 819, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 835, + line: 26, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 883, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 896, + line: 27, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Session", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../session", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 927, + line: 30, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 940, + line: 30, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1088, + line: 34, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1090, + line: 34, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1111, + line: 35, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1124, + line: 35, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1091, + line: 34, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1105, + line: 34, + col: 18, + }, + }, + Name: "json_available", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_83_dst.uast b/uast/diff/testdata/testcase_83_dst.uast new file mode 100644 index 00000000..c98a99db --- /dev/null +++ b/uast/diff/testdata/testcase_83_dst.uast @@ -0,0 +1,636 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 15, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 387, + line: 15, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 411, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 422, + line: 16, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 455, + line: 18, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 488, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 500, + line: 19, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 515, + line: 20, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 528, + line: 20, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 692, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 705, + line: 23, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 766, + line: 24, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 775, + line: 24, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 803, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 815, + line: 25, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 830, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 846, + line: 26, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 864, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 880, + line: 27, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 928, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 941, + line: 28, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Session", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../session", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 972, + line: 31, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 985, + line: 31, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1155, + line: 35, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1157, + line: 35, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1178, + line: 36, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1191, + line: 36, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1158, + line: 35, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1172, + line: 35, + col: 18, + }, + }, + Name: "json_available", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_83_src.uast b/uast/diff/testdata/testcase_83_src.uast new file mode 100644 index 00000000..da360845 --- /dev/null +++ b/uast/diff/testdata/testcase_83_src.uast @@ -0,0 +1,607 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 15, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 387, + line: 15, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 411, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 422, + line: 16, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 455, + line: 18, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 488, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 500, + line: 19, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 515, + line: 20, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 528, + line: 20, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 692, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 705, + line: 23, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 766, + line: 24, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 775, + line: 24, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 803, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 815, + line: 25, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 830, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 846, + line: 26, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 894, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 907, + line: 27, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Session", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../session", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 938, + line: 30, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 951, + line: 30, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1121, + line: 34, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1123, + line: 34, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1144, + line: 35, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1157, + line: 35, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1124, + line: 34, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1138, + line: 34, + col: 18, + }, + }, + Name: "json_available", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_84_dst.uast b/uast/diff/testdata/testcase_84_dst.uast new file mode 100644 index 00000000..84ef5cb3 --- /dev/null +++ b/uast/diff/testdata/testcase_84_dst.uast @@ -0,0 +1,1130 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 10, + line: 1, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 34, + line: 4, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 34, + line: 4, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 37, + line: 4, + col: 4, + }, + }, + Name: "mod", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 40, + line: 4, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 47, + line: 4, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 55, + line: 4, + col: 22, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 40, + line: 4, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 46, + line: 4, + col: 13, + }, + }, + Name: "Module", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 5, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 5, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 61, + line: 5, + col: 5, + }, + }, + Name: "mod2", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 64, + line: 5, + col: 8, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 71, + line: 5, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 79, + line: 5, + col: 23, + }, + }, + Name: "__name__", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 81, + line: 5, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 91, + line: 5, + col: 35, + }, + }, + Format: "", + Value: "testmod2", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 64, + line: 5, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 70, + line: 5, + col: 14, + }, + }, + Name: "Module", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 94, + line: 7, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 94, + line: 7, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 97, + line: 7, + col: 4, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 100, + line: 7, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 106, + line: 7, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 114, + line: 7, + col: 21, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 100, + line: 7, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 105, + line: 7, + col: 12, + }, + }, + Name: "Flask", + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 116, + line: 8, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 116, + line: 8, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 136, + line: 8, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 139, + line: 8, + col: 24, + }, + }, + Name: "mod", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 117, + line: 8, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 120, + line: 8, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 116, + line: 8, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 119, + line: 8, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 116, + line: 8, + col: 1, + }, + }, + Name: "register_module", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 141, + line: 9, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 141, + line: 9, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 161, + line: 9, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 165, + line: 9, + col: 25, + }, + }, + Name: "mod2", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 142, + line: 9, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 145, + line: 9, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 141, + line: 9, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 144, + line: 9, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 141, + line: 9, + col: 1, + }, + }, + Name: "register_module", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 173, + line: 12, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 183, + line: 12, + col: 15, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "handle_404", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 196, + line: 13, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 202, + line: 13, + col: 11, + }, + }, + value: { '@type': "Tuple", + '@role': [Expression, Literal, Primitive, Tuple], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 203, + line: 13, + col: 12, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 203, + line: 13, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 212, + line: 13, + col: 21, + }, + }, + Format: "", + Value: "Testing", + }, + { '@type': "Num", + '@token': 404, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 214, + line: 13, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 217, + line: 13, + col: 26, + }, + }, + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 184, + line: 12, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 189, + line: 12, + col: 21, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 184, + line: 12, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 189, + line: 12, + col: 21, + }, + }, + Name: "error", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 218, + line: 14, + col: 1, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 218, + line: 14, + col: 1, + }, + }, + ctx: "Store", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "Num", + '@token': 404, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 237, + line: 14, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 240, + line: 14, + col: 23, + }, + }, + }, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 219, + line: 14, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 222, + line: 14, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 218, + line: 14, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 221, + line: 14, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 218, + line: 14, + col: 1, + }, + }, + Name: "error_handlers", + }, + ], + }, + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 244, + line: 14, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 254, + line: 14, + col: 37, + }, + }, + Name: "handle_404", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 262, + line: 17, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 275, + line: 17, + col: 19, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "after_request", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 309, + line: 19, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 309, + line: 19, + col: 5, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 310, + line: 19, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 311, + line: 19, + col: 7, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 309, + line: 19, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 310, + line: 19, + col: 6, + }, + }, + Name: "g", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 311, + line: 19, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 313, + line: 19, + col: 9, + }, + }, + Name: "db", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 309, + line: 19, + col: 5, + }, + }, + Name: "close", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 326, + line: 20, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 332, + line: 20, + col: 11, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 333, + line: 20, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 341, + line: 20, + col: 20, + }, + }, + Name: "response", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 294, + line: 18, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 302, + line: 18, + col: 27, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 294, + line: 18, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 302, + line: 18, + col: 27, + }, + }, + Name: "response", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 344, + line: 23, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 377, + line: 25, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 383, + line: 25, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 384, + line: 25, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 400, + line: 25, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 417, + line: 25, + col: 45, + }, + }, + Format: "", + Value: "test/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 384, + line: 25, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 399, + line: 25, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 421, + line: 28, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 455, + line: 30, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 461, + line: 30, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 462, + line: 30, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 478, + line: 30, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 499, + line: 30, + col: 49, + }, + }, + Format: "", + Value: "testmod2/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 462, + line: 30, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 477, + line: 30, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 503, + line: 33, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 537, + line: 35, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 543, + line: 35, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 544, + line: 35, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 560, + line: 35, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 587, + line: 35, + col: 55, + }, + }, + Format: "", + Value: "something-else/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 544, + line: 35, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 559, + line: 35, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_84_src.uast b/uast/diff/testdata/testcase_84_src.uast new file mode 100644 index 00000000..fb3fd575 --- /dev/null +++ b/uast/diff/testdata/testcase_84_src.uast @@ -0,0 +1,897 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 10, + line: 1, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 34, + line: 4, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 34, + line: 4, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 37, + line: 4, + col: 4, + }, + }, + Name: "mod", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 40, + line: 4, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 47, + line: 4, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 55, + line: 4, + col: 22, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 40, + line: 4, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 46, + line: 4, + col: 13, + }, + }, + Name: "Module", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 5, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 5, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 61, + line: 5, + col: 5, + }, + }, + Name: "mod2", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 64, + line: 5, + col: 8, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 71, + line: 5, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 79, + line: 5, + col: 23, + }, + }, + Name: "__name__", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 81, + line: 5, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 91, + line: 5, + col: 35, + }, + }, + Format: "", + Value: "testmod2", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 64, + line: 5, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 70, + line: 5, + col: 14, + }, + }, + Name: "Module", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 94, + line: 7, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 94, + line: 7, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 97, + line: 7, + col: 4, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 100, + line: 7, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 106, + line: 7, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 114, + line: 7, + col: 21, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 100, + line: 7, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 105, + line: 7, + col: 12, + }, + }, + Name: "Flask", + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 116, + line: 8, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 116, + line: 8, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 136, + line: 8, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 139, + line: 8, + col: 24, + }, + }, + Name: "mod", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 117, + line: 8, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 120, + line: 8, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 116, + line: 8, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 119, + line: 8, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 116, + line: 8, + col: 1, + }, + }, + Name: "register_module", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 141, + line: 9, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 141, + line: 9, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 161, + line: 9, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 165, + line: 9, + col: 25, + }, + }, + Name: "mod2", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 142, + line: 9, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 145, + line: 9, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 141, + line: 9, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 144, + line: 9, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 141, + line: 9, + col: 1, + }, + }, + Name: "register_module", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 174, + line: 12, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 187, + line: 12, + col: 19, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "after_request", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 221, + line: 14, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 221, + line: 14, + col: 5, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 222, + line: 14, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 223, + line: 14, + col: 7, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 221, + line: 14, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 222, + line: 14, + col: 6, + }, + }, + Name: "g", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 223, + line: 14, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 225, + line: 14, + col: 9, + }, + }, + Name: "db", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 221, + line: 14, + col: 5, + }, + }, + Name: "close", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 238, + line: 15, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 244, + line: 15, + col: 11, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 245, + line: 15, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 253, + line: 15, + col: 20, + }, + }, + Name: "response", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 206, + line: 13, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 214, + line: 13, + col: 27, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 206, + line: 13, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 214, + line: 13, + col: 27, + }, + }, + Name: "response", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 256, + line: 18, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 289, + line: 20, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 295, + line: 20, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 296, + line: 20, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 312, + line: 20, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 329, + line: 20, + col: 45, + }, + }, + Format: "", + Value: "test/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 296, + line: 20, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 311, + line: 20, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 333, + line: 23, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 367, + line: 25, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 373, + line: 25, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 25, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 390, + line: 25, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 411, + line: 25, + col: 49, + }, + }, + Format: "", + Value: "testmod2/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 25, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 389, + line: 25, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 415, + line: 28, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 449, + line: 30, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 455, + line: 30, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 456, + line: 30, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 472, + line: 30, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 499, + line: 30, + col: 55, + }, + }, + Format: "", + Value: "something-else/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 456, + line: 30, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 471, + line: 30, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_85_dst.uast b/uast/diff/testdata/testcase_85_dst.uast new file mode 100644 index 00000000..477da42b --- /dev/null +++ b/uast/diff/testdata/testcase_85_dst.uast @@ -0,0 +1,1254 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 10, + line: 1, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 34, + line: 4, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 34, + line: 4, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 37, + line: 4, + col: 4, + }, + }, + Name: "mod", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 40, + line: 4, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 47, + line: 4, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 55, + line: 4, + col: 22, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 40, + line: 4, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 46, + line: 4, + col: 13, + }, + }, + Name: "Module", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 5, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 5, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 61, + line: 5, + col: 5, + }, + }, + Name: "mod2", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 64, + line: 5, + col: 8, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 71, + line: 5, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 79, + line: 5, + col: 23, + }, + }, + Name: "__name__", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 81, + line: 5, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 91, + line: 5, + col: 35, + }, + }, + Format: "", + Value: "testmod2", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 64, + line: 5, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 70, + line: 5, + col: 14, + }, + }, + Name: "Module", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 93, + line: 6, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 93, + line: 6, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 97, + line: 6, + col: 5, + }, + }, + Name: "mod3", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 100, + line: 6, + col: 8, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 107, + line: 6, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 115, + line: 6, + col: 23, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 100, + line: 6, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 106, + line: 6, + col: 14, + }, + }, + Name: "Module", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "name", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 122, + line: 6, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 131, + line: 6, + col: 39, + }, + }, + Format: "", + Value: "somemod", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "subdomain", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 143, + line: 6, + col: 51, + }, + end: { '@type': "uast:Position", + offset: 148, + line: 6, + col: 56, + }, + }, + Format: "", + Value: "meh", + }, + }, + ], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 151, + line: 8, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 151, + line: 8, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 154, + line: 8, + col: 4, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 157, + line: 8, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 163, + line: 8, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 171, + line: 8, + col: 21, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 157, + line: 8, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 162, + line: 8, + col: 12, + }, + }, + Name: "Flask", + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 173, + line: 9, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 173, + line: 9, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 193, + line: 9, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 196, + line: 9, + col: 24, + }, + }, + Name: "mod", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 174, + line: 9, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 177, + line: 9, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 173, + line: 9, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 176, + line: 9, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 173, + line: 9, + col: 1, + }, + }, + Name: "register_module", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 198, + line: 10, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 198, + line: 10, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 218, + line: 10, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 222, + line: 10, + col: 25, + }, + }, + Name: "mod2", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 199, + line: 10, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 202, + line: 10, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 198, + line: 10, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 201, + line: 10, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 198, + line: 10, + col: 1, + }, + }, + Name: "register_module", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 230, + line: 13, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 240, + line: 13, + col: 15, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "handle_404", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 253, + line: 14, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 259, + line: 14, + col: 11, + }, + }, + value: { '@type': "Tuple", + '@role': [Expression, Literal, Primitive, Tuple], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 260, + line: 14, + col: 12, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 260, + line: 14, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 269, + line: 14, + col: 21, + }, + }, + Format: "", + Value: "Testing", + }, + { '@type': "Num", + '@token': 404, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 14, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 274, + line: 14, + col: 26, + }, + }, + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 241, + line: 13, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 246, + line: 13, + col: 21, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 241, + line: 13, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 246, + line: 13, + col: 21, + }, + }, + Name: "error", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 275, + line: 15, + col: 1, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 275, + line: 15, + col: 1, + }, + }, + ctx: "Store", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "Num", + '@token': 404, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 294, + line: 15, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 297, + line: 15, + col: 23, + }, + }, + }, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 276, + line: 15, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 279, + line: 15, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 275, + line: 15, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 278, + line: 15, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 275, + line: 15, + col: 1, + }, + }, + Name: "error_handlers", + }, + ], + }, + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 301, + line: 15, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 311, + line: 15, + col: 37, + }, + }, + Name: "handle_404", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 319, + line: 18, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 332, + line: 18, + col: 19, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "after_request", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 366, + line: 20, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 366, + line: 20, + col: 5, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 367, + line: 20, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 368, + line: 20, + col: 7, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 366, + line: 20, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 367, + line: 20, + col: 6, + }, + }, + Name: "g", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 368, + line: 20, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 370, + line: 20, + col: 9, + }, + }, + Name: "db", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 366, + line: 20, + col: 5, + }, + }, + Name: "close", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 383, + line: 21, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 389, + line: 21, + col: 11, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 390, + line: 21, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 398, + line: 21, + col: 20, + }, + }, + Name: "response", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 351, + line: 19, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 359, + line: 19, + col: 27, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 351, + line: 19, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 359, + line: 19, + col: 27, + }, + }, + Name: "response", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 401, + line: 24, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 434, + line: 26, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 440, + line: 26, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 441, + line: 26, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 457, + line: 26, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 474, + line: 26, + col: 45, + }, + }, + Format: "", + Value: "test/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 441, + line: 26, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 456, + line: 26, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 478, + line: 29, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 512, + line: 31, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 518, + line: 31, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 519, + line: 31, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 535, + line: 31, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 556, + line: 31, + col: 49, + }, + }, + Format: "", + Value: "testmod2/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 519, + line: 31, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 534, + line: 31, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 560, + line: 34, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 594, + line: 36, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 600, + line: 36, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 601, + line: 36, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 617, + line: 36, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 644, + line: 36, + col: 55, + }, + }, + Format: "", + Value: "something-else/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 601, + line: 36, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 616, + line: 36, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_85_src.uast b/uast/diff/testdata/testcase_85_src.uast new file mode 100644 index 00000000..84ef5cb3 --- /dev/null +++ b/uast/diff/testdata/testcase_85_src.uast @@ -0,0 +1,1130 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 10, + line: 1, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 34, + line: 4, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 34, + line: 4, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 37, + line: 4, + col: 4, + }, + }, + Name: "mod", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 40, + line: 4, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 47, + line: 4, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 55, + line: 4, + col: 22, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 40, + line: 4, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 46, + line: 4, + col: 13, + }, + }, + Name: "Module", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 5, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 5, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 61, + line: 5, + col: 5, + }, + }, + Name: "mod2", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 64, + line: 5, + col: 8, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 71, + line: 5, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 79, + line: 5, + col: 23, + }, + }, + Name: "__name__", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 81, + line: 5, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 91, + line: 5, + col: 35, + }, + }, + Format: "", + Value: "testmod2", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 64, + line: 5, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 70, + line: 5, + col: 14, + }, + }, + Name: "Module", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 94, + line: 7, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 94, + line: 7, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 97, + line: 7, + col: 4, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 100, + line: 7, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 106, + line: 7, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 114, + line: 7, + col: 21, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 100, + line: 7, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 105, + line: 7, + col: 12, + }, + }, + Name: "Flask", + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 116, + line: 8, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 116, + line: 8, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 136, + line: 8, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 139, + line: 8, + col: 24, + }, + }, + Name: "mod", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 117, + line: 8, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 120, + line: 8, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 116, + line: 8, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 119, + line: 8, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 116, + line: 8, + col: 1, + }, + }, + Name: "register_module", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 141, + line: 9, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 141, + line: 9, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 161, + line: 9, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 165, + line: 9, + col: 25, + }, + }, + Name: "mod2", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 142, + line: 9, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 145, + line: 9, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 141, + line: 9, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 144, + line: 9, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 141, + line: 9, + col: 1, + }, + }, + Name: "register_module", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 173, + line: 12, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 183, + line: 12, + col: 15, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "handle_404", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 196, + line: 13, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 202, + line: 13, + col: 11, + }, + }, + value: { '@type': "Tuple", + '@role': [Expression, Literal, Primitive, Tuple], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 203, + line: 13, + col: 12, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 203, + line: 13, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 212, + line: 13, + col: 21, + }, + }, + Format: "", + Value: "Testing", + }, + { '@type': "Num", + '@token': 404, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 214, + line: 13, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 217, + line: 13, + col: 26, + }, + }, + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 184, + line: 12, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 189, + line: 12, + col: 21, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 184, + line: 12, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 189, + line: 12, + col: 21, + }, + }, + Name: "error", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 218, + line: 14, + col: 1, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 218, + line: 14, + col: 1, + }, + }, + ctx: "Store", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "Num", + '@token': 404, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 237, + line: 14, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 240, + line: 14, + col: 23, + }, + }, + }, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 219, + line: 14, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 222, + line: 14, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 218, + line: 14, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 221, + line: 14, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 218, + line: 14, + col: 1, + }, + }, + Name: "error_handlers", + }, + ], + }, + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 244, + line: 14, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 254, + line: 14, + col: 37, + }, + }, + Name: "handle_404", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 262, + line: 17, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 275, + line: 17, + col: 19, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "after_request", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 309, + line: 19, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 309, + line: 19, + col: 5, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 310, + line: 19, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 311, + line: 19, + col: 7, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 309, + line: 19, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 310, + line: 19, + col: 6, + }, + }, + Name: "g", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 311, + line: 19, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 313, + line: 19, + col: 9, + }, + }, + Name: "db", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 309, + line: 19, + col: 5, + }, + }, + Name: "close", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 326, + line: 20, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 332, + line: 20, + col: 11, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 333, + line: 20, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 341, + line: 20, + col: 20, + }, + }, + Name: "response", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 294, + line: 18, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 302, + line: 18, + col: 27, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 294, + line: 18, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 302, + line: 18, + col: 27, + }, + }, + Name: "response", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 344, + line: 23, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 377, + line: 25, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 383, + line: 25, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 384, + line: 25, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 400, + line: 25, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 417, + line: 25, + col: 45, + }, + }, + Format: "", + Value: "test/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 384, + line: 25, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 399, + line: 25, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 421, + line: 28, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 455, + line: 30, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 461, + line: 30, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 462, + line: 30, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 478, + line: 30, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 499, + line: 30, + col: 49, + }, + }, + Format: "", + Value: "testmod2/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 462, + line: 30, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 477, + line: 30, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 503, + line: 33, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 537, + line: 35, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 543, + line: 35, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 544, + line: 35, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 560, + line: 35, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 587, + line: 35, + col: 55, + }, + }, + Format: "", + Value: "something-else/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 544, + line: 35, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 559, + line: 35, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_86_dst.uast b/uast/diff/testdata/testcase_86_dst.uast new file mode 100644 index 00000000..c98a99db --- /dev/null +++ b/uast/diff/testdata/testcase_86_dst.uast @@ -0,0 +1,636 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 15, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 387, + line: 15, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 411, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 422, + line: 16, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 455, + line: 18, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 488, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 500, + line: 19, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 515, + line: 20, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 528, + line: 20, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 692, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 705, + line: 23, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 766, + line: 24, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 775, + line: 24, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 803, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 815, + line: 25, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 830, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 846, + line: 26, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 864, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 880, + line: 27, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 928, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 941, + line: 28, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Session", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../session", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 972, + line: 31, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 985, + line: 31, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1155, + line: 35, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1157, + line: 35, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1178, + line: 36, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1191, + line: 36, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1158, + line: 35, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1172, + line: 35, + col: 18, + }, + }, + Name: "json_available", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_86_src.uast b/uast/diff/testdata/testcase_86_src.uast new file mode 100644 index 00000000..da360845 --- /dev/null +++ b/uast/diff/testdata/testcase_86_src.uast @@ -0,0 +1,607 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 15, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 387, + line: 15, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 411, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 422, + line: 16, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 455, + line: 18, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 488, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 500, + line: 19, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 515, + line: 20, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 528, + line: 20, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 692, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 705, + line: 23, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 766, + line: 24, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 775, + line: 24, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 803, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 815, + line: 25, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 830, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 846, + line: 26, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 894, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 907, + line: 27, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Session", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../session", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 938, + line: 30, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 951, + line: 30, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1121, + line: 34, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1123, + line: 34, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1144, + line: 35, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1157, + line: 35, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1124, + line: 34, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1138, + line: 34, + col: 18, + }, + }, + Name: "json_available", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_87_dst.uast b/uast/diff/testdata/testcase_87_dst.uast new file mode 100644 index 00000000..477da42b --- /dev/null +++ b/uast/diff/testdata/testcase_87_dst.uast @@ -0,0 +1,1254 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 10, + line: 1, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 34, + line: 4, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 34, + line: 4, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 37, + line: 4, + col: 4, + }, + }, + Name: "mod", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 40, + line: 4, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 47, + line: 4, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 55, + line: 4, + col: 22, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 40, + line: 4, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 46, + line: 4, + col: 13, + }, + }, + Name: "Module", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 5, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 5, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 61, + line: 5, + col: 5, + }, + }, + Name: "mod2", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 64, + line: 5, + col: 8, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 71, + line: 5, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 79, + line: 5, + col: 23, + }, + }, + Name: "__name__", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 81, + line: 5, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 91, + line: 5, + col: 35, + }, + }, + Format: "", + Value: "testmod2", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 64, + line: 5, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 70, + line: 5, + col: 14, + }, + }, + Name: "Module", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 93, + line: 6, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 93, + line: 6, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 97, + line: 6, + col: 5, + }, + }, + Name: "mod3", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 100, + line: 6, + col: 8, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 107, + line: 6, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 115, + line: 6, + col: 23, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 100, + line: 6, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 106, + line: 6, + col: 14, + }, + }, + Name: "Module", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "name", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 122, + line: 6, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 131, + line: 6, + col: 39, + }, + }, + Format: "", + Value: "somemod", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "subdomain", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 143, + line: 6, + col: 51, + }, + end: { '@type': "uast:Position", + offset: 148, + line: 6, + col: 56, + }, + }, + Format: "", + Value: "meh", + }, + }, + ], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 151, + line: 8, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 151, + line: 8, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 154, + line: 8, + col: 4, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 157, + line: 8, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 163, + line: 8, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 171, + line: 8, + col: 21, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 157, + line: 8, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 162, + line: 8, + col: 12, + }, + }, + Name: "Flask", + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 173, + line: 9, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 173, + line: 9, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 193, + line: 9, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 196, + line: 9, + col: 24, + }, + }, + Name: "mod", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 174, + line: 9, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 177, + line: 9, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 173, + line: 9, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 176, + line: 9, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 173, + line: 9, + col: 1, + }, + }, + Name: "register_module", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 198, + line: 10, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 198, + line: 10, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 218, + line: 10, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 222, + line: 10, + col: 25, + }, + }, + Name: "mod2", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 199, + line: 10, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 202, + line: 10, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 198, + line: 10, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 201, + line: 10, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 198, + line: 10, + col: 1, + }, + }, + Name: "register_module", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 230, + line: 13, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 240, + line: 13, + col: 15, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "handle_404", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 253, + line: 14, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 259, + line: 14, + col: 11, + }, + }, + value: { '@type': "Tuple", + '@role': [Expression, Literal, Primitive, Tuple], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 260, + line: 14, + col: 12, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 260, + line: 14, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 269, + line: 14, + col: 21, + }, + }, + Format: "", + Value: "Testing", + }, + { '@type': "Num", + '@token': 404, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 14, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 274, + line: 14, + col: 26, + }, + }, + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 241, + line: 13, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 246, + line: 13, + col: 21, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 241, + line: 13, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 246, + line: 13, + col: 21, + }, + }, + Name: "error", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 275, + line: 15, + col: 1, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 275, + line: 15, + col: 1, + }, + }, + ctx: "Store", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "Num", + '@token': 404, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 294, + line: 15, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 297, + line: 15, + col: 23, + }, + }, + }, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 276, + line: 15, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 279, + line: 15, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 275, + line: 15, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 278, + line: 15, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 275, + line: 15, + col: 1, + }, + }, + Name: "error_handlers", + }, + ], + }, + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 301, + line: 15, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 311, + line: 15, + col: 37, + }, + }, + Name: "handle_404", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 319, + line: 18, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 332, + line: 18, + col: 19, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "after_request", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 366, + line: 20, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 366, + line: 20, + col: 5, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 367, + line: 20, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 368, + line: 20, + col: 7, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 366, + line: 20, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 367, + line: 20, + col: 6, + }, + }, + Name: "g", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 368, + line: 20, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 370, + line: 20, + col: 9, + }, + }, + Name: "db", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 366, + line: 20, + col: 5, + }, + }, + Name: "close", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 383, + line: 21, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 389, + line: 21, + col: 11, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 390, + line: 21, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 398, + line: 21, + col: 20, + }, + }, + Name: "response", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 351, + line: 19, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 359, + line: 19, + col: 27, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 351, + line: 19, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 359, + line: 19, + col: 27, + }, + }, + Name: "response", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 401, + line: 24, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 434, + line: 26, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 440, + line: 26, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 441, + line: 26, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 457, + line: 26, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 474, + line: 26, + col: 45, + }, + }, + Format: "", + Value: "test/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 441, + line: 26, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 456, + line: 26, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 478, + line: 29, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 512, + line: 31, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 518, + line: 31, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 519, + line: 31, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 535, + line: 31, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 556, + line: 31, + col: 49, + }, + }, + Format: "", + Value: "testmod2/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 519, + line: 31, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 534, + line: 31, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 560, + line: 34, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 594, + line: 36, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 600, + line: 36, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 601, + line: 36, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 617, + line: 36, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 644, + line: 36, + col: 55, + }, + }, + Format: "", + Value: "something-else/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 601, + line: 36, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 616, + line: 36, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_87_src.uast b/uast/diff/testdata/testcase_87_src.uast new file mode 100644 index 00000000..84ef5cb3 --- /dev/null +++ b/uast/diff/testdata/testcase_87_src.uast @@ -0,0 +1,1130 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 10, + line: 1, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 34, + line: 4, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 34, + line: 4, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 37, + line: 4, + col: 4, + }, + }, + Name: "mod", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 40, + line: 4, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 47, + line: 4, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 55, + line: 4, + col: 22, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 40, + line: 4, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 46, + line: 4, + col: 13, + }, + }, + Name: "Module", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 5, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 5, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 61, + line: 5, + col: 5, + }, + }, + Name: "mod2", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 64, + line: 5, + col: 8, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 71, + line: 5, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 79, + line: 5, + col: 23, + }, + }, + Name: "__name__", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 81, + line: 5, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 91, + line: 5, + col: 35, + }, + }, + Format: "", + Value: "testmod2", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 64, + line: 5, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 70, + line: 5, + col: 14, + }, + }, + Name: "Module", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 94, + line: 7, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 94, + line: 7, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 97, + line: 7, + col: 4, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 100, + line: 7, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 106, + line: 7, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 114, + line: 7, + col: 21, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 100, + line: 7, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 105, + line: 7, + col: 12, + }, + }, + Name: "Flask", + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 116, + line: 8, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 116, + line: 8, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 136, + line: 8, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 139, + line: 8, + col: 24, + }, + }, + Name: "mod", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 117, + line: 8, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 120, + line: 8, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 116, + line: 8, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 119, + line: 8, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 116, + line: 8, + col: 1, + }, + }, + Name: "register_module", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 141, + line: 9, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 141, + line: 9, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 161, + line: 9, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 165, + line: 9, + col: 25, + }, + }, + Name: "mod2", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 142, + line: 9, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 145, + line: 9, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 141, + line: 9, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 144, + line: 9, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 141, + line: 9, + col: 1, + }, + }, + Name: "register_module", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 173, + line: 12, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 183, + line: 12, + col: 15, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "handle_404", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 196, + line: 13, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 202, + line: 13, + col: 11, + }, + }, + value: { '@type': "Tuple", + '@role': [Expression, Literal, Primitive, Tuple], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 203, + line: 13, + col: 12, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 203, + line: 13, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 212, + line: 13, + col: 21, + }, + }, + Format: "", + Value: "Testing", + }, + { '@type': "Num", + '@token': 404, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 214, + line: 13, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 217, + line: 13, + col: 26, + }, + }, + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 184, + line: 12, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 189, + line: 12, + col: 21, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 184, + line: 12, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 189, + line: 12, + col: 21, + }, + }, + Name: "error", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 218, + line: 14, + col: 1, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 218, + line: 14, + col: 1, + }, + }, + ctx: "Store", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "Num", + '@token': 404, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 237, + line: 14, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 240, + line: 14, + col: 23, + }, + }, + }, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 219, + line: 14, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 222, + line: 14, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 218, + line: 14, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 221, + line: 14, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 218, + line: 14, + col: 1, + }, + }, + Name: "error_handlers", + }, + ], + }, + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 244, + line: 14, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 254, + line: 14, + col: 37, + }, + }, + Name: "handle_404", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 262, + line: 17, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 275, + line: 17, + col: 19, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "after_request", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 309, + line: 19, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 309, + line: 19, + col: 5, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 310, + line: 19, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 311, + line: 19, + col: 7, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 309, + line: 19, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 310, + line: 19, + col: 6, + }, + }, + Name: "g", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 311, + line: 19, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 313, + line: 19, + col: 9, + }, + }, + Name: "db", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 309, + line: 19, + col: 5, + }, + }, + Name: "close", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 326, + line: 20, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 332, + line: 20, + col: 11, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 333, + line: 20, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 341, + line: 20, + col: 20, + }, + }, + Name: "response", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 294, + line: 18, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 302, + line: 18, + col: 27, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 294, + line: 18, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 302, + line: 18, + col: 27, + }, + }, + Name: "response", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 344, + line: 23, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 377, + line: 25, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 383, + line: 25, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 384, + line: 25, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 400, + line: 25, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 417, + line: 25, + col: 45, + }, + }, + Format: "", + Value: "test/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 384, + line: 25, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 399, + line: 25, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 421, + line: 28, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 455, + line: 30, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 461, + line: 30, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 462, + line: 30, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 478, + line: 30, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 499, + line: 30, + col: 49, + }, + }, + Format: "", + Value: "testmod2/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 462, + line: 30, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 477, + line: 30, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 503, + line: 33, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 537, + line: 35, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 543, + line: 35, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 544, + line: 35, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 560, + line: 35, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 587, + line: 35, + col: 55, + }, + }, + Format: "", + Value: "something-else/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 544, + line: 35, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 559, + line: 35, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_88_dst.uast b/uast/diff/testdata/testcase_88_dst.uast new file mode 100644 index 00000000..fa52dabf --- /dev/null +++ b/uast/diff/testdata/testcase_88_dst.uast @@ -0,0 +1,1262 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 10, + line: 1, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 51, + line: 4, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 51, + line: 4, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 54, + line: 4, + col: 4, + }, + }, + Name: "mod", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 4, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 64, + line: 4, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 72, + line: 4, + col: 22, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 4, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 63, + line: 4, + col: 13, + }, + }, + Name: "Module", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 74, + line: 5, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 74, + line: 5, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 78, + line: 5, + col: 5, + }, + }, + Name: "mod2", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 81, + line: 5, + col: 8, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 88, + line: 5, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 96, + line: 5, + col: 23, + }, + }, + Name: "__name__", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 98, + line: 5, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 108, + line: 5, + col: 35, + }, + }, + Format: "", + Value: "testmod2", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 81, + line: 5, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 87, + line: 5, + col: 14, + }, + }, + Name: "Module", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 110, + line: 6, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 110, + line: 6, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 114, + line: 6, + col: 5, + }, + }, + Name: "mod3", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 117, + line: 6, + col: 8, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 124, + line: 6, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 132, + line: 6, + col: 23, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 117, + line: 6, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 123, + line: 6, + col: 14, + }, + }, + Name: "Module", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "name", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 139, + line: 6, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 148, + line: 6, + col: 39, + }, + }, + Format: "", + Value: "somemod", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "subdomain", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 160, + line: 6, + col: 51, + }, + end: { '@type': "uast:Position", + offset: 165, + line: 6, + col: 56, + }, + }, + Format: "", + Value: "meh", + }, + }, + ], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 174, + line: 9, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 187, + line: 9, + col: 19, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "after_request", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 221, + line: 11, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 221, + line: 11, + col: 5, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 222, + line: 11, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 223, + line: 11, + col: 7, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 221, + line: 11, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 222, + line: 11, + col: 6, + }, + }, + Name: "g", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 223, + line: 11, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 225, + line: 11, + col: 9, + }, + }, + Name: "db", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 221, + line: 11, + col: 5, + }, + }, + Name: "close", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 238, + line: 12, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 244, + line: 12, + col: 11, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 245, + line: 12, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 253, + line: 12, + col: 20, + }, + }, + Name: "response", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 206, + line: 10, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 214, + line: 10, + col: 27, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 206, + line: 10, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 214, + line: 10, + col: 27, + }, + }, + Name: "response", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 256, + line: 15, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 289, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 295, + line: 17, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 296, + line: 17, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 312, + line: 17, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 329, + line: 17, + col: 45, + }, + }, + Format: "", + Value: "test/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 296, + line: 17, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 311, + line: 17, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 333, + line: 20, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "mod2_index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 372, + line: 22, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 378, + line: 22, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 379, + line: 22, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 395, + line: 22, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 416, + line: 22, + col: 49, + }, + }, + Format: "", + Value: "testmod2/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 379, + line: 22, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 394, + line: 22, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 420, + line: 25, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "mod3_index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 459, + line: 27, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 465, + line: 27, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 466, + line: 27, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 482, + line: 27, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 509, + line: 27, + col: 55, + }, + }, + Format: "", + Value: "something-else/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 466, + line: 27, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 481, + line: 27, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 513, + line: 30, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 513, + line: 30, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 516, + line: 30, + col: 4, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 519, + line: 30, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 525, + line: 30, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 533, + line: 30, + col: 21, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 519, + line: 30, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 524, + line: 30, + col: 12, + }, + }, + Name: "Flask", + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 535, + line: 31, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 535, + line: 31, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 555, + line: 31, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 558, + line: 31, + col: 24, + }, + }, + Name: "mod", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 536, + line: 31, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 539, + line: 31, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 535, + line: 31, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 538, + line: 31, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 535, + line: 31, + col: 1, + }, + }, + Name: "register_module", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 560, + line: 32, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 560, + line: 32, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 580, + line: 32, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 584, + line: 32, + col: 25, + }, + }, + Name: "mod2", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 561, + line: 32, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 564, + line: 32, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 560, + line: 32, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 563, + line: 32, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 560, + line: 32, + col: 1, + }, + }, + Name: "register_module", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 592, + line: 35, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 602, + line: 35, + col: 15, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "handle_404", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 615, + line: 36, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 621, + line: 36, + col: 11, + }, + }, + value: { '@type': "Tuple", + '@role': [Expression, Literal, Primitive, Tuple], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 622, + line: 36, + col: 12, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 622, + line: 36, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 631, + line: 36, + col: 21, + }, + }, + Format: "", + Value: "Testing", + }, + { '@type': "Num", + '@token': 404, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 633, + line: 36, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 636, + line: 36, + col: 26, + }, + }, + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 603, + line: 35, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 608, + line: 35, + col: 21, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 603, + line: 35, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 608, + line: 35, + col: 21, + }, + }, + Name: "error", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 637, + line: 37, + col: 1, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 637, + line: 37, + col: 1, + }, + }, + ctx: "Store", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "Num", + '@token': 404, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 656, + line: 37, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 659, + line: 37, + col: 23, + }, + }, + }, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 638, + line: 37, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 641, + line: 37, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 637, + line: 37, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 640, + line: 37, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 637, + line: 37, + col: 1, + }, + }, + Name: "error_handlers", + }, + ], + }, + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 663, + line: 37, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 673, + line: 37, + col: 37, + }, + }, + Name: "handle_404", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_88_src.uast b/uast/diff/testdata/testcase_88_src.uast new file mode 100644 index 00000000..477da42b --- /dev/null +++ b/uast/diff/testdata/testcase_88_src.uast @@ -0,0 +1,1254 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 10, + line: 1, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 34, + line: 4, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 34, + line: 4, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 37, + line: 4, + col: 4, + }, + }, + Name: "mod", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 40, + line: 4, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 47, + line: 4, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 55, + line: 4, + col: 22, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 40, + line: 4, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 46, + line: 4, + col: 13, + }, + }, + Name: "Module", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 5, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 5, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 61, + line: 5, + col: 5, + }, + }, + Name: "mod2", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 64, + line: 5, + col: 8, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 71, + line: 5, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 79, + line: 5, + col: 23, + }, + }, + Name: "__name__", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 81, + line: 5, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 91, + line: 5, + col: 35, + }, + }, + Format: "", + Value: "testmod2", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 64, + line: 5, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 70, + line: 5, + col: 14, + }, + }, + Name: "Module", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 93, + line: 6, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 93, + line: 6, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 97, + line: 6, + col: 5, + }, + }, + Name: "mod3", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 100, + line: 6, + col: 8, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 107, + line: 6, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 115, + line: 6, + col: 23, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 100, + line: 6, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 106, + line: 6, + col: 14, + }, + }, + Name: "Module", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "name", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 122, + line: 6, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 131, + line: 6, + col: 39, + }, + }, + Format: "", + Value: "somemod", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "subdomain", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 143, + line: 6, + col: 51, + }, + end: { '@type': "uast:Position", + offset: 148, + line: 6, + col: 56, + }, + }, + Format: "", + Value: "meh", + }, + }, + ], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 151, + line: 8, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 151, + line: 8, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 154, + line: 8, + col: 4, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 157, + line: 8, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 163, + line: 8, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 171, + line: 8, + col: 21, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 157, + line: 8, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 162, + line: 8, + col: 12, + }, + }, + Name: "Flask", + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 173, + line: 9, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 173, + line: 9, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 193, + line: 9, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 196, + line: 9, + col: 24, + }, + }, + Name: "mod", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 174, + line: 9, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 177, + line: 9, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 173, + line: 9, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 176, + line: 9, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 173, + line: 9, + col: 1, + }, + }, + Name: "register_module", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 198, + line: 10, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 198, + line: 10, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 218, + line: 10, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 222, + line: 10, + col: 25, + }, + }, + Name: "mod2", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 199, + line: 10, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 202, + line: 10, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 198, + line: 10, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 201, + line: 10, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 198, + line: 10, + col: 1, + }, + }, + Name: "register_module", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 230, + line: 13, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 240, + line: 13, + col: 15, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "handle_404", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 253, + line: 14, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 259, + line: 14, + col: 11, + }, + }, + value: { '@type': "Tuple", + '@role': [Expression, Literal, Primitive, Tuple], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 260, + line: 14, + col: 12, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 260, + line: 14, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 269, + line: 14, + col: 21, + }, + }, + Format: "", + Value: "Testing", + }, + { '@type': "Num", + '@token': 404, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 14, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 274, + line: 14, + col: 26, + }, + }, + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 241, + line: 13, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 246, + line: 13, + col: 21, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 241, + line: 13, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 246, + line: 13, + col: 21, + }, + }, + Name: "error", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 275, + line: 15, + col: 1, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 275, + line: 15, + col: 1, + }, + }, + ctx: "Store", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "Num", + '@token': 404, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 294, + line: 15, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 297, + line: 15, + col: 23, + }, + }, + }, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 276, + line: 15, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 279, + line: 15, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 275, + line: 15, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 278, + line: 15, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 275, + line: 15, + col: 1, + }, + }, + Name: "error_handlers", + }, + ], + }, + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 301, + line: 15, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 311, + line: 15, + col: 37, + }, + }, + Name: "handle_404", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 319, + line: 18, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 332, + line: 18, + col: 19, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "after_request", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 366, + line: 20, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 366, + line: 20, + col: 5, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 367, + line: 20, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 368, + line: 20, + col: 7, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 366, + line: 20, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 367, + line: 20, + col: 6, + }, + }, + Name: "g", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 368, + line: 20, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 370, + line: 20, + col: 9, + }, + }, + Name: "db", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 366, + line: 20, + col: 5, + }, + }, + Name: "close", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 383, + line: 21, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 389, + line: 21, + col: 11, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 390, + line: 21, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 398, + line: 21, + col: 20, + }, + }, + Name: "response", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 351, + line: 19, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 359, + line: 19, + col: 27, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 351, + line: 19, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 359, + line: 19, + col: 27, + }, + }, + Name: "response", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 401, + line: 24, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 434, + line: 26, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 440, + line: 26, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 441, + line: 26, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 457, + line: 26, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 474, + line: 26, + col: 45, + }, + }, + Format: "", + Value: "test/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 441, + line: 26, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 456, + line: 26, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 478, + line: 29, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 512, + line: 31, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 518, + line: 31, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 519, + line: 31, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 535, + line: 31, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 556, + line: 31, + col: 49, + }, + }, + Format: "", + Value: "testmod2/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 519, + line: 31, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 534, + line: 31, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 560, + line: 34, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 594, + line: 36, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 600, + line: 36, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 601, + line: 36, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 617, + line: 36, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 644, + line: 36, + col: 55, + }, + }, + Format: "", + Value: "something-else/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 601, + line: 36, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 616, + line: 36, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_89_dst.uast b/uast/diff/testdata/testcase_89_dst.uast new file mode 100644 index 00000000..32b12d6e --- /dev/null +++ b/uast/diff/testdata/testcase_89_dst.uast @@ -0,0 +1,681 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 13, + col: 12, + }, + }, + Name: "__version__", + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 13, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 276, + line: 13, + col: 20, + }, + }, + Format: "", + Value: "0.7", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 395, + line: 17, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 408, + line: 17, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 432, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 443, + line: 18, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 467, + line: 20, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 476, + line: 20, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 509, + line: 21, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 521, + line: 21, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 536, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 549, + line: 22, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 713, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 726, + line: 25, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 787, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 796, + line: 26, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 824, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 836, + line: 27, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 851, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 867, + line: 28, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 885, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 901, + line: 29, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 949, + line: 30, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 962, + line: 30, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Session", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../session", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 993, + line: 33, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1006, + line: 33, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1176, + line: 37, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1178, + line: 37, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1199, + line: 38, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1212, + line: 38, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1179, + line: 37, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1193, + line: 37, + col: 18, + }, + }, + Name: "json_available", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_89_src.uast b/uast/diff/testdata/testcase_89_src.uast new file mode 100644 index 00000000..c98a99db --- /dev/null +++ b/uast/diff/testdata/testcase_89_src.uast @@ -0,0 +1,636 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 15, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 387, + line: 15, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 411, + line: 16, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 422, + line: 16, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 455, + line: 18, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 488, + line: 19, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 500, + line: 19, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 515, + line: 20, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 528, + line: 20, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 692, + line: 23, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 705, + line: 23, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 766, + line: 24, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 775, + line: 24, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 803, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 815, + line: 25, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 830, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 846, + line: 26, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 864, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 880, + line: 27, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 928, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 941, + line: 28, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Session", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../session", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 972, + line: 31, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 985, + line: 31, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1155, + line: 35, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1157, + line: 35, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1178, + line: 36, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1191, + line: 36, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1158, + line: 35, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1172, + line: 35, + col: 18, + }, + }, + Name: "json_available", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_8_dst.uast b/uast/diff/testdata/testcase_8_dst.uast new file mode 100644 index 00000000..c64b255e --- /dev/null +++ b/uast/diff/testdata/testcase_8_dst.uast @@ -0,0 +1,155 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 10, + line: 1, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 27, + line: 2, + col: 4, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 30, + line: 2, + col: 7, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 36, + line: 2, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 53, + line: 2, + col: 30, + }, + }, + Format: "", + Value: "yourapplication", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 30, + line: 2, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 35, + line: 2, + col: 12, + }, + }, + Name: "Flask", + }, + keywords: [], + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 56, + line: 4, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "yourapplication.views", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 55, + line: 3, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 55, + line: 3, + col: 1, + }, + }, + lines: [], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_8_src.uast b/uast/diff/testdata/testcase_8_src.uast new file mode 100644 index 00000000..a62a1070 --- /dev/null +++ b/uast/diff/testdata/testcase_8_src.uast @@ -0,0 +1,154 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 10, + line: 1, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 27, + line: 2, + col: 4, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 30, + line: 2, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 36, + line: 2, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 44, + line: 2, + col: 21, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 30, + line: 2, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 35, + line: 2, + col: 12, + }, + }, + Name: "Flask", + }, + keywords: [], + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 47, + line: 4, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "yourapplication.views", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 46, + line: 3, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 46, + line: 3, + col: 1, + }, + }, + lines: [], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_90_dst.uast b/uast/diff/testdata/testcase_90_dst.uast new file mode 100644 index 00000000..f910c3f9 --- /dev/null +++ b/uast/diff/testdata/testcase_90_dst.uast @@ -0,0 +1,1315 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 246, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 249, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask.globals\n ~~~~~~~~~~~~~\n\n Defines all the global objects that are proxies to the current\n active context.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 251, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 265, + line: 13, + col: 15, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "partial", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "functools", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 281, + line: 14, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "LocalStack", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "LocalProxy", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.local", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 336, + line: 16, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 350, + line: 16, + col: 19, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_lookup_object", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 362, + line: 17, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 362, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 365, + line: 17, + col: 8, + }, + }, + Name: "top", + }, + ], + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 369, + line: 17, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 387, + line: 17, + col: 30, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 368, + line: 17, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 386, + line: 17, + col: 29, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 368, + line: 17, + col: 11, + }, + }, + Name: "top", + }, + ], + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 395, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 397, + line: 18, + col: 7, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Raise", + '@token': "raise", + '@role': [Statement, Throw], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 419, + line: 19, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 424, + line: 19, + col: 14, + }, + }, + cause: ~, + exc: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 425, + line: 19, + col: 15, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 438, + line: 19, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 474, + line: 19, + col: 64, + }, + }, + Format: "", + Value: "working outside of request context", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 425, + line: 19, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 437, + line: 19, + col: 27, + }, + }, + Name: "RuntimeError", + }, + keywords: [], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 398, + line: 18, + col: 8, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 405, + line: 18, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 409, + line: 18, + col: 19, + }, + }, + LiteralValue: "None", + value: ~, + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 398, + line: 18, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 401, + line: 18, + col: 11, + }, + }, + Name: "top", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Is", + '@token': "is", + '@role': [Identical, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 480, + line: 20, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 486, + line: 20, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 487, + line: 20, + col: 12, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 495, + line: 20, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 498, + line: 20, + col: 23, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 500, + line: 20, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 504, + line: 20, + col: 29, + }, + }, + Name: "name", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 487, + line: 20, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 494, + line: 20, + col: 19, + }, + }, + Name: "getattr", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 351, + line: 16, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 355, + line: 16, + col: 24, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 351, + line: 16, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 355, + line: 16, + col: 24, + }, + }, + Name: "name", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 512, + line: 23, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 521, + line: 23, + col: 14, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_find_app", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 529, + line: 24, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 529, + line: 24, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 532, + line: 24, + col: 8, + }, + }, + Name: "top", + }, + ], + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 536, + line: 24, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 550, + line: 24, + col: 26, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 535, + line: 24, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 549, + line: 24, + col: 25, + }, + }, + Name: "_app_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 535, + line: 24, + col: 11, + }, + }, + Name: "top", + }, + ], + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 558, + line: 25, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 560, + line: 25, + col: 7, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Raise", + '@token': "raise", + '@role': [Statement, Throw], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 582, + line: 26, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 587, + line: 26, + col: 14, + }, + }, + cause: ~, + exc: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 588, + line: 26, + col: 15, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 601, + line: 26, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 641, + line: 26, + col: 68, + }, + }, + Format: "", + Value: "working outside of application context", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 588, + line: 26, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 600, + line: 26, + col: 27, + }, + }, + Name: "RuntimeError", + }, + keywords: [], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 561, + line: 25, + col: 8, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 568, + line: 25, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 572, + line: 25, + col: 19, + }, + }, + LiteralValue: "None", + value: ~, + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 561, + line: 25, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 564, + line: 25, + col: 11, + }, + }, + Name: "top", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Is", + '@token': "is", + '@role': [Identical, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 647, + line: 27, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 653, + line: 27, + col: 11, + }, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 655, + line: 27, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 658, + line: 27, + col: 16, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 654, + line: 27, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 657, + line: 27, + col: 15, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 654, + line: 27, + col: 12, + }, + }, + Name: "app", + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 681, + line: 31, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 681, + line: 31, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 699, + line: 31, + col: 19, + }, + }, + Name: "_request_ctx_stack", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 702, + line: 31, + col: 22, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 702, + line: 31, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 712, + line: 31, + col: 32, + }, + }, + Name: "LocalStack", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 715, + line: 32, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 715, + line: 32, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 729, + line: 32, + col: 15, + }, + }, + Name: "_app_ctx_stack", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 732, + line: 32, + col: 18, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 732, + line: 32, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 742, + line: 32, + col: 28, + }, + }, + Name: "LocalStack", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 745, + line: 33, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 745, + line: 33, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 756, + line: 33, + col: 12, + }, + }, + Name: "current_app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 759, + line: 33, + col: 15, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 770, + line: 33, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 779, + line: 33, + col: 35, + }, + }, + Name: "_find_app", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 759, + line: 33, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 769, + line: 33, + col: 25, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 781, + line: 34, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 781, + line: 34, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 788, + line: 34, + col: 8, + }, + }, + Name: "request", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 791, + line: 34, + col: 11, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 802, + line: 34, + col: 22, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 810, + line: 34, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 824, + line: 34, + col: 44, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 826, + line: 34, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 835, + line: 34, + col: 55, + }, + }, + Format: "", + Value: "request", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 802, + line: 34, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 809, + line: 34, + col: 29, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 791, + line: 34, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 801, + line: 34, + col: 21, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 838, + line: 35, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 838, + line: 35, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 845, + line: 35, + col: 8, + }, + }, + Name: "session", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 848, + line: 35, + col: 11, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 859, + line: 35, + col: 22, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 867, + line: 35, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 881, + line: 35, + col: 44, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 883, + line: 35, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 892, + line: 35, + col: 55, + }, + }, + Format: "", + Value: "session", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 859, + line: 35, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 866, + line: 35, + col: 29, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 848, + line: 35, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 858, + line: 35, + col: 21, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 895, + line: 36, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 895, + line: 36, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 896, + line: 36, + col: 2, + }, + }, + Name: "g", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 899, + line: 36, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 910, + line: 36, + col: 16, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 918, + line: 36, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 932, + line: 36, + col: 38, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 934, + line: 36, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 937, + line: 36, + col: 43, + }, + }, + Format: "", + Value: "g", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 910, + line: 36, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 917, + line: 36, + col: 23, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 899, + line: 36, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 909, + line: 36, + col: 15, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_90_src.uast b/uast/diff/testdata/testcase_90_src.uast new file mode 100644 index 00000000..20208574 --- /dev/null +++ b/uast/diff/testdata/testcase_90_src.uast @@ -0,0 +1,992 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 246, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 249, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask.globals\n ~~~~~~~~~~~~~\n\n Defines all the global objects that are proxies to the current\n active context.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 251, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 265, + line: 13, + col: 15, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "partial", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "functools", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 281, + line: 14, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "LocalStack", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "LocalProxy", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.local", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 336, + line: 16, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 350, + line: 16, + col: 19, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_lookup_object", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 362, + line: 17, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 362, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 365, + line: 17, + col: 8, + }, + }, + Name: "top", + }, + ], + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 369, + line: 17, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 387, + line: 17, + col: 30, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 368, + line: 17, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 386, + line: 17, + col: 29, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 368, + line: 17, + col: 11, + }, + }, + Name: "top", + }, + ], + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 395, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 397, + line: 18, + col: 7, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Raise", + '@token': "raise", + '@role': [Statement, Throw], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 419, + line: 19, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 424, + line: 19, + col: 14, + }, + }, + cause: ~, + exc: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 425, + line: 19, + col: 15, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 438, + line: 19, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 474, + line: 19, + col: 64, + }, + }, + Format: "", + Value: "working outside of request context", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 425, + line: 19, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 437, + line: 19, + col: 27, + }, + }, + Name: "RuntimeError", + }, + keywords: [], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 398, + line: 18, + col: 8, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 405, + line: 18, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 409, + line: 18, + col: 19, + }, + }, + LiteralValue: "None", + value: ~, + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 398, + line: 18, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 401, + line: 18, + col: 11, + }, + }, + Name: "top", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Is", + '@token': "is", + '@role': [Identical, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 480, + line: 20, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 486, + line: 20, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 487, + line: 20, + col: 12, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 495, + line: 20, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 498, + line: 20, + col: 23, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 500, + line: 20, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 504, + line: 20, + col: 29, + }, + }, + Name: "name", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 487, + line: 20, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 494, + line: 20, + col: 19, + }, + }, + Name: "getattr", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 351, + line: 16, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 355, + line: 16, + col: 24, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 351, + line: 16, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 355, + line: 16, + col: 24, + }, + }, + Name: "name", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 525, + line: 24, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 525, + line: 24, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 543, + line: 24, + col: 19, + }, + }, + Name: "_request_ctx_stack", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 546, + line: 24, + col: 22, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 546, + line: 24, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 556, + line: 24, + col: 32, + }, + }, + Name: "LocalStack", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 559, + line: 25, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 559, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 570, + line: 25, + col: 12, + }, + }, + Name: "current_app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 573, + line: 25, + col: 15, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 584, + line: 25, + col: 26, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 592, + line: 25, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 606, + line: 25, + col: 48, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 608, + line: 25, + col: 50, + }, + end: { '@type': "uast:Position", + offset: 613, + line: 25, + col: 55, + }, + }, + Format: "", + Value: "app", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 584, + line: 25, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 591, + line: 25, + col: 33, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 573, + line: 25, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 583, + line: 25, + col: 25, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 616, + line: 26, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 616, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 623, + line: 26, + col: 8, + }, + }, + Name: "request", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 626, + line: 26, + col: 11, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 637, + line: 26, + col: 22, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 645, + line: 26, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 659, + line: 26, + col: 44, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 661, + line: 26, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 670, + line: 26, + col: 55, + }, + }, + Format: "", + Value: "request", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 637, + line: 26, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 644, + line: 26, + col: 29, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 626, + line: 26, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 636, + line: 26, + col: 21, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 673, + line: 27, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 673, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 680, + line: 27, + col: 8, + }, + }, + Name: "session", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 683, + line: 27, + col: 11, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 694, + line: 27, + col: 22, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 702, + line: 27, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 716, + line: 27, + col: 44, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 718, + line: 27, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 727, + line: 27, + col: 55, + }, + }, + Format: "", + Value: "session", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 694, + line: 27, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 701, + line: 27, + col: 29, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 683, + line: 27, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 693, + line: 27, + col: 21, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 730, + line: 28, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 730, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 731, + line: 28, + col: 2, + }, + }, + Name: "g", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 734, + line: 28, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 745, + line: 28, + col: 16, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 753, + line: 28, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 767, + line: 28, + col: 38, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 769, + line: 28, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 772, + line: 28, + col: 43, + }, + }, + Format: "", + Value: "g", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 745, + line: 28, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 752, + line: 28, + col: 23, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 734, + line: 28, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 744, + line: 28, + col: 15, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_91_dst.uast b/uast/diff/testdata/testcase_91_dst.uast new file mode 100644 index 00000000..00bde417 --- /dev/null +++ b/uast/diff/testdata/testcase_91_dst.uast @@ -0,0 +1,1681 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 246, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 249, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask.globals\n ~~~~~~~~~~~~~\n\n Defines all the global objects that are proxies to the current\n active context.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 251, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 265, + line: 13, + col: 15, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "partial", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "functools", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 281, + line: 14, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "LocalStack", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "LocalProxy", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.local", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 337, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 355, + line: 17, + col: 23, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_lookup_req_object", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 367, + line: 18, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 367, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 370, + line: 18, + col: 8, + }, + }, + Name: "top", + }, + ], + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 374, + line: 18, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 392, + line: 18, + col: 30, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 373, + line: 18, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 391, + line: 18, + col: 29, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 373, + line: 18, + col: 11, + }, + }, + Name: "top", + }, + ], + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 400, + line: 19, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 402, + line: 19, + col: 7, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Raise", + '@token': "raise", + '@role': [Statement, Throw], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 424, + line: 20, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 429, + line: 20, + col: 14, + }, + }, + cause: ~, + exc: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 430, + line: 20, + col: 15, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 443, + line: 20, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 479, + line: 20, + col: 64, + }, + }, + Format: "", + Value: "working outside of request context", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 430, + line: 20, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 442, + line: 20, + col: 27, + }, + }, + Name: "RuntimeError", + }, + keywords: [], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 403, + line: 19, + col: 8, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 410, + line: 19, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 414, + line: 19, + col: 19, + }, + }, + LiteralValue: "None", + value: ~, + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 403, + line: 19, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 406, + line: 19, + col: 11, + }, + }, + Name: "top", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Is", + '@token': "is", + '@role': [Identical, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 485, + line: 21, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 491, + line: 21, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 492, + line: 21, + col: 12, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 500, + line: 21, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 503, + line: 21, + col: 23, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 505, + line: 21, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 509, + line: 21, + col: 29, + }, + }, + Name: "name", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 492, + line: 21, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 499, + line: 21, + col: 19, + }, + }, + Name: "getattr", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 356, + line: 17, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 360, + line: 17, + col: 28, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 356, + line: 17, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 360, + line: 17, + col: 28, + }, + }, + Name: "name", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 517, + line: 24, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 535, + line: 24, + col: 23, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_lookup_app_object", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 547, + line: 25, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 547, + line: 25, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 550, + line: 25, + col: 8, + }, + }, + Name: "top", + }, + ], + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 554, + line: 25, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 568, + line: 25, + col: 26, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 553, + line: 25, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 567, + line: 25, + col: 25, + }, + }, + Name: "_app_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 553, + line: 25, + col: 11, + }, + }, + Name: "top", + }, + ], + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 576, + line: 26, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 578, + line: 26, + col: 7, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Raise", + '@token': "raise", + '@role': [Statement, Throw], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 600, + line: 27, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 605, + line: 27, + col: 14, + }, + }, + cause: ~, + exc: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 606, + line: 27, + col: 15, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 619, + line: 27, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 659, + line: 27, + col: 68, + }, + }, + Format: "", + Value: "working outside of application context", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 606, + line: 27, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 618, + line: 27, + col: 27, + }, + }, + Name: "RuntimeError", + }, + keywords: [], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 579, + line: 26, + col: 8, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 586, + line: 26, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 590, + line: 26, + col: 19, + }, + }, + LiteralValue: "None", + value: ~, + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 579, + line: 26, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 582, + line: 26, + col: 11, + }, + }, + Name: "top", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Is", + '@token': "is", + '@role': [Identical, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 665, + line: 28, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 671, + line: 28, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 672, + line: 28, + col: 12, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 680, + line: 28, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 683, + line: 28, + col: 23, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 685, + line: 28, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 689, + line: 28, + col: 29, + }, + }, + Name: "name", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 672, + line: 28, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 679, + line: 28, + col: 19, + }, + }, + Name: "getattr", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 536, + line: 24, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 540, + line: 24, + col: 28, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 536, + line: 24, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 540, + line: 24, + col: 28, + }, + }, + Name: "name", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 697, + line: 31, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 706, + line: 31, + col: 14, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_find_app", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 714, + line: 32, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 714, + line: 32, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 717, + line: 32, + col: 8, + }, + }, + Name: "top", + }, + ], + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 721, + line: 32, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 735, + line: 32, + col: 26, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 720, + line: 32, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 734, + line: 32, + col: 25, + }, + }, + Name: "_app_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 720, + line: 32, + col: 11, + }, + }, + Name: "top", + }, + ], + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 743, + line: 33, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 745, + line: 33, + col: 7, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Raise", + '@token': "raise", + '@role': [Statement, Throw], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 767, + line: 34, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 772, + line: 34, + col: 14, + }, + }, + cause: ~, + exc: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 773, + line: 34, + col: 15, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 786, + line: 34, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 826, + line: 34, + col: 68, + }, + }, + Format: "", + Value: "working outside of application context", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 773, + line: 34, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 785, + line: 34, + col: 27, + }, + }, + Name: "RuntimeError", + }, + keywords: [], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 746, + line: 33, + col: 8, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 753, + line: 33, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 757, + line: 33, + col: 19, + }, + }, + LiteralValue: "None", + value: ~, + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 746, + line: 33, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 749, + line: 33, + col: 11, + }, + }, + Name: "top", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Is", + '@token': "is", + '@role': [Identical, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 832, + line: 35, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 838, + line: 35, + col: 11, + }, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 840, + line: 35, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 843, + line: 35, + col: 16, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 839, + line: 35, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 842, + line: 35, + col: 15, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 839, + line: 35, + col: 12, + }, + }, + Name: "app", + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 866, + line: 39, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 866, + line: 39, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 884, + line: 39, + col: 19, + }, + }, + Name: "_request_ctx_stack", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 887, + line: 39, + col: 22, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 887, + line: 39, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 897, + line: 39, + col: 32, + }, + }, + Name: "LocalStack", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 900, + line: 40, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 900, + line: 40, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 914, + line: 40, + col: 15, + }, + }, + Name: "_app_ctx_stack", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 917, + line: 40, + col: 18, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 917, + line: 40, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 927, + line: 40, + col: 28, + }, + }, + Name: "LocalStack", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 930, + line: 41, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 930, + line: 41, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 941, + line: 41, + col: 12, + }, + }, + Name: "current_app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 944, + line: 41, + col: 15, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 955, + line: 41, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 964, + line: 41, + col: 35, + }, + }, + Name: "_find_app", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 944, + line: 41, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 954, + line: 41, + col: 25, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 966, + line: 42, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 966, + line: 42, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 973, + line: 42, + col: 8, + }, + }, + Name: "request", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 976, + line: 42, + col: 11, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 987, + line: 42, + col: 22, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 995, + line: 42, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 1013, + line: 42, + col: 48, + }, + }, + Name: "_lookup_req_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1015, + line: 42, + col: 50, + }, + end: { '@type': "uast:Position", + offset: 1024, + line: 42, + col: 59, + }, + }, + Format: "", + Value: "request", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 987, + line: 42, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 994, + line: 42, + col: 29, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 976, + line: 42, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 986, + line: 42, + col: 21, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1027, + line: 43, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1027, + line: 43, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1034, + line: 43, + col: 8, + }, + }, + Name: "session", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1037, + line: 43, + col: 11, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1048, + line: 43, + col: 22, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1056, + line: 43, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 1074, + line: 43, + col: 48, + }, + }, + Name: "_lookup_req_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1076, + line: 43, + col: 50, + }, + end: { '@type': "uast:Position", + offset: 1085, + line: 43, + col: 59, + }, + }, + Format: "", + Value: "session", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1048, + line: 43, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 1055, + line: 43, + col: 29, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1037, + line: 43, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 1047, + line: 43, + col: 21, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1088, + line: 44, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1088, + line: 44, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1089, + line: 44, + col: 2, + }, + }, + Name: "g", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1092, + line: 44, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1103, + line: 44, + col: 16, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1111, + line: 44, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 1129, + line: 44, + col: 42, + }, + }, + Name: "_lookup_app_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1131, + line: 44, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 1134, + line: 44, + col: 47, + }, + }, + Format: "", + Value: "g", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1103, + line: 44, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 1110, + line: 44, + col: 23, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1092, + line: 44, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1102, + line: 44, + col: 15, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_91_src.uast b/uast/diff/testdata/testcase_91_src.uast new file mode 100644 index 00000000..f910c3f9 --- /dev/null +++ b/uast/diff/testdata/testcase_91_src.uast @@ -0,0 +1,1315 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 246, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 249, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask.globals\n ~~~~~~~~~~~~~\n\n Defines all the global objects that are proxies to the current\n active context.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 251, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 265, + line: 13, + col: 15, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "partial", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "functools", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 281, + line: 14, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "LocalStack", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "LocalProxy", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug.local", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 336, + line: 16, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 350, + line: 16, + col: 19, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_lookup_object", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 362, + line: 17, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 362, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 365, + line: 17, + col: 8, + }, + }, + Name: "top", + }, + ], + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 369, + line: 17, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 387, + line: 17, + col: 30, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 368, + line: 17, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 386, + line: 17, + col: 29, + }, + }, + Name: "_request_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 368, + line: 17, + col: 11, + }, + }, + Name: "top", + }, + ], + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 395, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 397, + line: 18, + col: 7, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Raise", + '@token': "raise", + '@role': [Statement, Throw], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 419, + line: 19, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 424, + line: 19, + col: 14, + }, + }, + cause: ~, + exc: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 425, + line: 19, + col: 15, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 438, + line: 19, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 474, + line: 19, + col: 64, + }, + }, + Format: "", + Value: "working outside of request context", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 425, + line: 19, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 437, + line: 19, + col: 27, + }, + }, + Name: "RuntimeError", + }, + keywords: [], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 398, + line: 18, + col: 8, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 405, + line: 18, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 409, + line: 18, + col: 19, + }, + }, + LiteralValue: "None", + value: ~, + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 398, + line: 18, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 401, + line: 18, + col: 11, + }, + }, + Name: "top", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Is", + '@token': "is", + '@role': [Identical, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 480, + line: 20, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 486, + line: 20, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 487, + line: 20, + col: 12, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 495, + line: 20, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 498, + line: 20, + col: 23, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 500, + line: 20, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 504, + line: 20, + col: 29, + }, + }, + Name: "name", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 487, + line: 20, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 494, + line: 20, + col: 19, + }, + }, + Name: "getattr", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 351, + line: 16, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 355, + line: 16, + col: 24, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 351, + line: 16, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 355, + line: 16, + col: 24, + }, + }, + Name: "name", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 512, + line: 23, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 521, + line: 23, + col: 14, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "_find_app", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 529, + line: 24, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 529, + line: 24, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 532, + line: 24, + col: 8, + }, + }, + Name: "top", + }, + ], + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 536, + line: 24, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 550, + line: 24, + col: 26, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 535, + line: 24, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 549, + line: 24, + col: 25, + }, + }, + Name: "_app_ctx_stack", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 535, + line: 24, + col: 11, + }, + }, + Name: "top", + }, + ], + }, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 558, + line: 25, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 560, + line: 25, + col: 7, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "Raise", + '@token': "raise", + '@role': [Statement, Throw], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 582, + line: 26, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 587, + line: 26, + col: 14, + }, + }, + cause: ~, + exc: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 588, + line: 26, + col: 15, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 601, + line: 26, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 641, + line: 26, + col: 68, + }, + }, + Format: "", + Value: "working outside of application context", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 588, + line: 26, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 600, + line: 26, + col: 27, + }, + }, + Name: "RuntimeError", + }, + keywords: [], + }, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 561, + line: 25, + col: 8, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "NoneLiteral", + '@token': "None", + '@role': [Expression, Literal, 'Null', Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 568, + line: 25, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 572, + line: 25, + col: 19, + }, + }, + LiteralValue: "None", + value: ~, + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 561, + line: 25, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 564, + line: 25, + col: 11, + }, + }, + Name: "top", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Is", + '@token': "is", + '@role': [Identical, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 647, + line: 27, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 653, + line: 27, + col: 11, + }, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 655, + line: 27, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 658, + line: 27, + col: 16, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 654, + line: 27, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 657, + line: 27, + col: 15, + }, + }, + Name: "top", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 654, + line: 27, + col: 12, + }, + }, + Name: "app", + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 681, + line: 31, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 681, + line: 31, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 699, + line: 31, + col: 19, + }, + }, + Name: "_request_ctx_stack", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 702, + line: 31, + col: 22, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 702, + line: 31, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 712, + line: 31, + col: 32, + }, + }, + Name: "LocalStack", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 715, + line: 32, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 715, + line: 32, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 729, + line: 32, + col: 15, + }, + }, + Name: "_app_ctx_stack", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 732, + line: 32, + col: 18, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 732, + line: 32, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 742, + line: 32, + col: 28, + }, + }, + Name: "LocalStack", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 745, + line: 33, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 745, + line: 33, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 756, + line: 33, + col: 12, + }, + }, + Name: "current_app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 759, + line: 33, + col: 15, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 770, + line: 33, + col: 26, + }, + end: { '@type': "uast:Position", + offset: 779, + line: 33, + col: 35, + }, + }, + Name: "_find_app", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 759, + line: 33, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 769, + line: 33, + col: 25, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 781, + line: 34, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 781, + line: 34, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 788, + line: 34, + col: 8, + }, + }, + Name: "request", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 791, + line: 34, + col: 11, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 802, + line: 34, + col: 22, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 810, + line: 34, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 824, + line: 34, + col: 44, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 826, + line: 34, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 835, + line: 34, + col: 55, + }, + }, + Format: "", + Value: "request", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 802, + line: 34, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 809, + line: 34, + col: 29, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 791, + line: 34, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 801, + line: 34, + col: 21, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 838, + line: 35, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 838, + line: 35, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 845, + line: 35, + col: 8, + }, + }, + Name: "session", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 848, + line: 35, + col: 11, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 859, + line: 35, + col: 22, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 867, + line: 35, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 881, + line: 35, + col: 44, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 883, + line: 35, + col: 46, + }, + end: { '@type': "uast:Position", + offset: 892, + line: 35, + col: 55, + }, + }, + Format: "", + Value: "session", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 859, + line: 35, + col: 22, + }, + end: { '@type': "uast:Position", + offset: 866, + line: 35, + col: 29, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 848, + line: 35, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 858, + line: 35, + col: 21, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 895, + line: 36, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 895, + line: 36, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 896, + line: 36, + col: 2, + }, + }, + Name: "g", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 899, + line: 36, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 910, + line: 36, + col: 16, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 918, + line: 36, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 932, + line: 36, + col: 38, + }, + }, + Name: "_lookup_object", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 934, + line: 36, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 937, + line: 36, + col: 43, + }, + }, + Format: "", + Value: "g", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 910, + line: 36, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 917, + line: 36, + col: 23, + }, + }, + Name: "partial", + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 899, + line: 36, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 909, + line: 36, + col: 15, + }, + }, + Name: "LocalProxy", + }, + keywords: [], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_92_dst.uast b/uast/diff/testdata/testcase_92_dst.uast new file mode 100644 index 00000000..be41e849 --- /dev/null +++ b/uast/diff/testdata/testcase_92_dst.uast @@ -0,0 +1,1266 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 244, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 247, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n tests.subclassing\n ~~~~~~~~~~~~~~~~~\n\n Test that certain behavior of flask can be customized by\n subclasses.\n\n :copyright: (c) 2014 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 248, + line: 12, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flask", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 261, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 273, + line: 13, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "StreamHandler", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "logging", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 296, + line: 15, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "StringIO", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask._compat", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 337, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 370, + line: 18, + col: 38, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "test_suppressed_exception_logging", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "ClassDef", + '@token': "SuppressedFlask", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 384, + line: 19, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 399, + line: 19, + col: 26, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 401, + line: 19, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 406, + line: 19, + col: 33, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 400, + line: 19, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 405, + line: 19, + col: 32, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 400, + line: 19, + col: 27, + }, + }, + Name: "Flask", + }, + ], + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 426, + line: 20, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 439, + line: 20, + col: 26, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "log_exception", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Pass", + '@token': "pass", + '@role': [Noop, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 469, + line: 21, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 473, + line: 21, + col: 17, + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 440, + line: 20, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 444, + line: 20, + col: 31, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 440, + line: 20, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 444, + line: 20, + col: 31, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 20, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 454, + line: 20, + col: 41, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 20, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 454, + line: 20, + col: 41, + }, + }, + Name: "exc_info", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 479, + line: 23, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 479, + line: 23, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 482, + line: 23, + col: 8, + }, + }, + Name: "out", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 485, + line: 23, + col: 11, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 485, + line: 23, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 493, + line: 23, + col: 19, + }, + }, + Name: "StringIO", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 500, + line: 24, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 500, + line: 24, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 503, + line: 24, + col: 8, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 506, + line: 24, + col: 11, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 522, + line: 24, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 530, + line: 24, + col: 35, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 506, + line: 24, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 521, + line: 24, + col: 26, + }, + }, + Name: "SuppressedFlask", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 536, + line: 25, + col: 5, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 537, + line: 25, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 540, + line: 25, + col: 9, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 536, + line: 25, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 539, + line: 25, + col: 8, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 536, + line: 25, + col: 5, + }, + }, + Name: "logger_name", + }, + ], + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 554, + line: 25, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 601, + line: 25, + col: 70, + }, + }, + Format: "", + Value: "flask_tests/test_suppressed_exception_logging", + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 606, + line: 26, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 606, + line: 26, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 628, + line: 26, + col: 27, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 642, + line: 26, + col: 41, + }, + end: { '@type': "uast:Position", + offset: 645, + line: 26, + col: 44, + }, + }, + Name: "out", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 628, + line: 26, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 641, + line: 26, + col: 40, + }, + }, + Name: "StreamHandler", + }, + keywords: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 607, + line: 26, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 610, + line: 26, + col: 9, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 606, + line: 26, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 609, + line: 26, + col: 8, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 610, + line: 26, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 616, + line: 26, + col: 15, + }, + }, + Name: "logger", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 606, + line: 26, + col: 5, + }, + }, + Name: "addHandler", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 653, + line: 28, + col: 5, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 694, + line: 30, + col: 9, + }, + }, + value: { '@type': "BinOp", + '@role': [Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 694, + line: 30, + col: 9, + }, + }, + left: { '@type': "Num", + '@token': 1, + '@role': [Binary, Expression, Left, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 694, + line: 30, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 695, + line: 30, + col: 10, + }, + }, + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 648, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 648, + line: 27, + col: 1, + }, + }, + lines: [], + }, + }, + op: { '@type': "FloorDiv", + '@token': "//", + '@role': [Arithmetic, Binary, Divide, Incomplete, Operator], + '@pos': { '@type': "uast:Positions", + }, + }, + right: { '@type': "Num", + '@token': 0, + '@role': [Binary, Expression, Literal, Number, Primitive, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 699, + line: 30, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 700, + line: 30, + col: 15, + }, + }, + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 706, + line: 32, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 706, + line: 32, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 708, + line: 32, + col: 7, + }, + }, + Name: "rv", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 711, + line: 32, + col: 10, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 733, + line: 32, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 736, + line: 32, + col: 35, + }, + }, + Format: "", + Value: "/", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 712, + line: 32, + col: 11, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 711, + line: 32, + col: 10, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 712, + line: 32, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 715, + line: 32, + col: 14, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 711, + line: 32, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 714, + line: 32, + col: 13, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 711, + line: 32, + col: 10, + }, + }, + Name: "test_client", + }, + ], + }, + keywords: [], + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 711, + line: 32, + col: 10, + }, + }, + Name: "get", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 742, + line: 33, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 748, + line: 33, + col: 11, + }, + }, + msg: ~, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 749, + line: 33, + col: 12, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "Num", + '@token': 500, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 767, + line: 33, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 770, + line: 33, + col: 33, + }, + }, + }, + ], + }, + left: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 750, + line: 33, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 752, + line: 33, + col: 15, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 749, + line: 33, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 751, + line: 33, + col: 14, + }, + }, + Name: "rv", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 749, + line: 33, + col: 12, + }, + }, + Name: "status_code", + }, + ], + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 775, + line: 34, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 781, + line: 34, + col: 11, + }, + }, + msg: ~, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 782, + line: 34, + col: 12, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 811, + line: 34, + col: 41, + }, + end: { '@type': "uast:Position", + offset: 813, + line: 34, + col: 43, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 810, + line: 34, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 812, + line: 34, + col: 42, + }, + }, + Name: "rv", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 810, + line: 34, + col: 40, + }, + }, + Name: "data", + }, + ], + }, + ], + }, + left: { '@type': "uast:String", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 782, + line: 34, + col: 12, + }, + }, + Format: "", + Value: "Internal Server Error", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "In", + '@token': "in", + '@role': [Contains, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 823, + line: 36, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 823, + line: 36, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 826, + line: 36, + col: 8, + }, + }, + Name: "err", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 829, + line: 36, + col: 11, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 830, + line: 36, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 833, + line: 36, + col: 15, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 829, + line: 36, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 832, + line: 36, + col: 14, + }, + }, + Name: "out", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 829, + line: 36, + col: 11, + }, + }, + Name: "getvalue", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 848, + line: 37, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 854, + line: 37, + col: 11, + }, + }, + msg: ~, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 855, + line: 37, + col: 12, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 862, + line: 37, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 864, + line: 37, + col: 21, + }, + }, + Format: "", + Value: "", + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 855, + line: 37, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 858, + line: 37, + col: 15, + }, + }, + Name: "err", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_92_src.uast b/uast/diff/testdata/testcase_92_src.uast new file mode 100644 index 00000000..fba81615 --- /dev/null +++ b/uast/diff/testdata/testcase_92_src.uast @@ -0,0 +1,1295 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 254, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 257, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n tests.subclassing\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n Test that certain behavior of flask can be customized by\n subclasses.\n\n :copyright: (c) 2014 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 258, + line: 12, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flask", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 13, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "unittest", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 287, + line: 14, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 299, + line: 14, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "StreamHandler", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "logging", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 322, + line: 16, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "StringIO", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask._compat", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 363, + line: 19, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 396, + line: 19, + col: 38, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "test_suppressed_exception_logging", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "ClassDef", + '@token': "SuppressedFlask", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 410, + line: 20, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 425, + line: 20, + col: 26, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 427, + line: 20, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 432, + line: 20, + col: 33, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 426, + line: 20, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 431, + line: 20, + col: 32, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 426, + line: 20, + col: 27, + }, + }, + Name: "Flask", + }, + ], + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 452, + line: 21, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 465, + line: 21, + col: 26, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "log_exception", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Pass", + '@token': "pass", + '@role': [Noop, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 495, + line: 22, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 499, + line: 22, + col: 17, + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 466, + line: 21, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 470, + line: 21, + col: 31, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 466, + line: 21, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 470, + line: 21, + col: 31, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 472, + line: 21, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 480, + line: 21, + col: 41, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 472, + line: 21, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 480, + line: 21, + col: 41, + }, + }, + Name: "exc_info", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 505, + line: 24, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 505, + line: 24, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 508, + line: 24, + col: 8, + }, + }, + Name: "out", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 511, + line: 24, + col: 11, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 511, + line: 24, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 519, + line: 24, + col: 19, + }, + }, + Name: "StringIO", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 526, + line: 25, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 526, + line: 25, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 529, + line: 25, + col: 8, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 532, + line: 25, + col: 11, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 548, + line: 25, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 556, + line: 25, + col: 35, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 532, + line: 25, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 547, + line: 25, + col: 26, + }, + }, + Name: "SuppressedFlask", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 562, + line: 26, + col: 5, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 563, + line: 26, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 566, + line: 26, + col: 9, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 562, + line: 26, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 565, + line: 26, + col: 8, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 562, + line: 26, + col: 5, + }, + }, + Name: "logger_name", + }, + ], + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 580, + line: 26, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 627, + line: 26, + col: 70, + }, + }, + Format: "", + Value: "flask_tests/test_suppressed_exception_logging", + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 632, + line: 27, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 632, + line: 27, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 654, + line: 27, + col: 27, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 668, + line: 27, + col: 41, + }, + end: { '@type': "uast:Position", + offset: 671, + line: 27, + col: 44, + }, + }, + Name: "out", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 654, + line: 27, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 667, + line: 27, + col: 40, + }, + }, + Name: "StreamHandler", + }, + keywords: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 633, + line: 27, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 636, + line: 27, + col: 9, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 632, + line: 27, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 635, + line: 27, + col: 8, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 636, + line: 27, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 642, + line: 27, + col: 15, + }, + }, + Name: "logger", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 632, + line: 27, + col: 5, + }, + }, + Name: "addHandler", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 679, + line: 29, + col: 5, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 720, + line: 31, + col: 9, + }, + }, + value: { '@type': "BinOp", + '@role': [Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 720, + line: 31, + col: 9, + }, + }, + left: { '@type': "Num", + '@token': 1, + '@role': [Binary, Expression, Left, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 720, + line: 31, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 721, + line: 31, + col: 10, + }, + }, + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 674, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 674, + line: 28, + col: 1, + }, + }, + lines: [], + }, + }, + op: { '@type': "FloorDiv", + '@token': "//", + '@role': [Arithmetic, Binary, Divide, Incomplete, Operator], + '@pos': { '@type': "uast:Positions", + }, + }, + right: { '@type': "Num", + '@token': 0, + '@role': [Binary, Expression, Literal, Number, Primitive, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 725, + line: 31, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 726, + line: 31, + col: 15, + }, + }, + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 732, + line: 33, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 732, + line: 33, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 734, + line: 33, + col: 7, + }, + }, + Name: "rv", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 737, + line: 33, + col: 10, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 759, + line: 33, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 762, + line: 33, + col: 35, + }, + }, + Format: "", + Value: "/", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 738, + line: 33, + col: 11, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 737, + line: 33, + col: 10, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 738, + line: 33, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 741, + line: 33, + col: 14, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 737, + line: 33, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 740, + line: 33, + col: 13, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 737, + line: 33, + col: 10, + }, + }, + Name: "test_client", + }, + ], + }, + keywords: [], + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 737, + line: 33, + col: 10, + }, + }, + Name: "get", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 768, + line: 34, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 774, + line: 34, + col: 11, + }, + }, + msg: ~, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 775, + line: 34, + col: 12, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "Num", + '@token': 500, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 793, + line: 34, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 796, + line: 34, + col: 33, + }, + }, + }, + ], + }, + left: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 776, + line: 34, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 778, + line: 34, + col: 15, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 775, + line: 34, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 777, + line: 34, + col: 14, + }, + }, + Name: "rv", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 775, + line: 34, + col: 12, + }, + }, + Name: "status_code", + }, + ], + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 801, + line: 35, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 807, + line: 35, + col: 11, + }, + }, + msg: ~, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 808, + line: 35, + col: 12, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 837, + line: 35, + col: 41, + }, + end: { '@type': "uast:Position", + offset: 839, + line: 35, + col: 43, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 836, + line: 35, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 838, + line: 35, + col: 42, + }, + }, + Name: "rv", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 836, + line: 35, + col: 40, + }, + }, + Name: "data", + }, + ], + }, + ], + }, + left: { '@type': "uast:String", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 808, + line: 35, + col: 12, + }, + }, + Format: "", + Value: "Internal Server Error", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "In", + '@token': "in", + '@role': [Contains, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 849, + line: 37, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 849, + line: 37, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 852, + line: 37, + col: 8, + }, + }, + Name: "err", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 855, + line: 37, + col: 11, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 856, + line: 37, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 859, + line: 37, + col: 15, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 855, + line: 37, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 858, + line: 37, + col: 14, + }, + }, + Name: "out", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 855, + line: 37, + col: 11, + }, + }, + Name: "getvalue", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 874, + line: 38, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 880, + line: 38, + col: 11, + }, + }, + msg: ~, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 881, + line: 38, + col: 12, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 888, + line: 38, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 890, + line: 38, + col: 21, + }, + }, + Format: "", + Value: "", + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 881, + line: 38, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 884, + line: 38, + col: 15, + }, + }, + Name: "err", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_93_dst.uast b/uast/diff/testdata/testcase_93_dst.uast new file mode 100644 index 00000000..d75a9afc --- /dev/null +++ b/uast/diff/testdata/testcase_93_dst.uast @@ -0,0 +1,1266 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 244, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 247, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n tests.subclassing\n ~~~~~~~~~~~~~~~~~\n\n Test that certain behavior of flask can be customized by\n subclasses.\n\n :copyright: (c) 2015 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 248, + line: 12, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flask", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 261, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 273, + line: 13, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "StreamHandler", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "logging", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 296, + line: 15, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "StringIO", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask._compat", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 337, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 370, + line: 18, + col: 38, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "test_suppressed_exception_logging", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "ClassDef", + '@token': "SuppressedFlask", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 384, + line: 19, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 399, + line: 19, + col: 26, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 401, + line: 19, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 406, + line: 19, + col: 33, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 400, + line: 19, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 405, + line: 19, + col: 32, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 400, + line: 19, + col: 27, + }, + }, + Name: "Flask", + }, + ], + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 426, + line: 20, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 439, + line: 20, + col: 26, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "log_exception", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Pass", + '@token': "pass", + '@role': [Noop, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 469, + line: 21, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 473, + line: 21, + col: 17, + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 440, + line: 20, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 444, + line: 20, + col: 31, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 440, + line: 20, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 444, + line: 20, + col: 31, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 20, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 454, + line: 20, + col: 41, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 20, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 454, + line: 20, + col: 41, + }, + }, + Name: "exc_info", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 479, + line: 23, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 479, + line: 23, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 482, + line: 23, + col: 8, + }, + }, + Name: "out", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 485, + line: 23, + col: 11, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 485, + line: 23, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 493, + line: 23, + col: 19, + }, + }, + Name: "StringIO", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 500, + line: 24, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 500, + line: 24, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 503, + line: 24, + col: 8, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 506, + line: 24, + col: 11, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 522, + line: 24, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 530, + line: 24, + col: 35, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 506, + line: 24, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 521, + line: 24, + col: 26, + }, + }, + Name: "SuppressedFlask", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 536, + line: 25, + col: 5, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 537, + line: 25, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 540, + line: 25, + col: 9, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 536, + line: 25, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 539, + line: 25, + col: 8, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 536, + line: 25, + col: 5, + }, + }, + Name: "logger_name", + }, + ], + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 554, + line: 25, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 601, + line: 25, + col: 70, + }, + }, + Format: "", + Value: "flask_tests/test_suppressed_exception_logging", + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 606, + line: 26, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 606, + line: 26, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 628, + line: 26, + col: 27, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 642, + line: 26, + col: 41, + }, + end: { '@type': "uast:Position", + offset: 645, + line: 26, + col: 44, + }, + }, + Name: "out", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 628, + line: 26, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 641, + line: 26, + col: 40, + }, + }, + Name: "StreamHandler", + }, + keywords: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 607, + line: 26, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 610, + line: 26, + col: 9, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 606, + line: 26, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 609, + line: 26, + col: 8, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 610, + line: 26, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 616, + line: 26, + col: 15, + }, + }, + Name: "logger", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 606, + line: 26, + col: 5, + }, + }, + Name: "addHandler", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 653, + line: 28, + col: 5, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 694, + line: 30, + col: 9, + }, + }, + value: { '@type': "BinOp", + '@role': [Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 694, + line: 30, + col: 9, + }, + }, + left: { '@type': "Num", + '@token': 1, + '@role': [Binary, Expression, Left, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 694, + line: 30, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 695, + line: 30, + col: 10, + }, + }, + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 648, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 648, + line: 27, + col: 1, + }, + }, + lines: [], + }, + }, + op: { '@type': "FloorDiv", + '@token': "//", + '@role': [Arithmetic, Binary, Divide, Incomplete, Operator], + '@pos': { '@type': "uast:Positions", + }, + }, + right: { '@type': "Num", + '@token': 0, + '@role': [Binary, Expression, Literal, Number, Primitive, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 699, + line: 30, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 700, + line: 30, + col: 15, + }, + }, + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 706, + line: 32, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 706, + line: 32, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 708, + line: 32, + col: 7, + }, + }, + Name: "rv", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 711, + line: 32, + col: 10, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 733, + line: 32, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 736, + line: 32, + col: 35, + }, + }, + Format: "", + Value: "/", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 712, + line: 32, + col: 11, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 711, + line: 32, + col: 10, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 712, + line: 32, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 715, + line: 32, + col: 14, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 711, + line: 32, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 714, + line: 32, + col: 13, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 711, + line: 32, + col: 10, + }, + }, + Name: "test_client", + }, + ], + }, + keywords: [], + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 711, + line: 32, + col: 10, + }, + }, + Name: "get", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 742, + line: 33, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 748, + line: 33, + col: 11, + }, + }, + msg: ~, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 749, + line: 33, + col: 12, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "Num", + '@token': 500, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 767, + line: 33, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 770, + line: 33, + col: 33, + }, + }, + }, + ], + }, + left: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 750, + line: 33, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 752, + line: 33, + col: 15, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 749, + line: 33, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 751, + line: 33, + col: 14, + }, + }, + Name: "rv", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 749, + line: 33, + col: 12, + }, + }, + Name: "status_code", + }, + ], + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 775, + line: 34, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 781, + line: 34, + col: 11, + }, + }, + msg: ~, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 782, + line: 34, + col: 12, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 811, + line: 34, + col: 41, + }, + end: { '@type': "uast:Position", + offset: 813, + line: 34, + col: 43, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 810, + line: 34, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 812, + line: 34, + col: 42, + }, + }, + Name: "rv", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 810, + line: 34, + col: 40, + }, + }, + Name: "data", + }, + ], + }, + ], + }, + left: { '@type': "uast:String", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 782, + line: 34, + col: 12, + }, + }, + Format: "", + Value: "Internal Server Error", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "In", + '@token': "in", + '@role': [Contains, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 823, + line: 36, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 823, + line: 36, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 826, + line: 36, + col: 8, + }, + }, + Name: "err", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 829, + line: 36, + col: 11, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 830, + line: 36, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 833, + line: 36, + col: 15, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 829, + line: 36, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 832, + line: 36, + col: 14, + }, + }, + Name: "out", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 829, + line: 36, + col: 11, + }, + }, + Name: "getvalue", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 848, + line: 37, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 854, + line: 37, + col: 11, + }, + }, + msg: ~, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 855, + line: 37, + col: 12, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 862, + line: 37, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 864, + line: 37, + col: 21, + }, + }, + Format: "", + Value: "", + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 855, + line: 37, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 858, + line: 37, + col: 15, + }, + }, + Name: "err", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_93_src.uast b/uast/diff/testdata/testcase_93_src.uast new file mode 100644 index 00000000..be41e849 --- /dev/null +++ b/uast/diff/testdata/testcase_93_src.uast @@ -0,0 +1,1266 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 244, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 247, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n tests.subclassing\n ~~~~~~~~~~~~~~~~~\n\n Test that certain behavior of flask can be customized by\n subclasses.\n\n :copyright: (c) 2014 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 248, + line: 12, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flask", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 261, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 273, + line: 13, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "StreamHandler", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "logging", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 296, + line: 15, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "StringIO", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask._compat", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 337, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 370, + line: 18, + col: 38, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "test_suppressed_exception_logging", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "ClassDef", + '@token': "SuppressedFlask", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 384, + line: 19, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 399, + line: 19, + col: 26, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 401, + line: 19, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 406, + line: 19, + col: 33, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 400, + line: 19, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 405, + line: 19, + col: 32, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 400, + line: 19, + col: 27, + }, + }, + Name: "Flask", + }, + ], + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 426, + line: 20, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 439, + line: 20, + col: 26, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "log_exception", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Pass", + '@token': "pass", + '@role': [Noop, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 469, + line: 21, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 473, + line: 21, + col: 17, + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 440, + line: 20, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 444, + line: 20, + col: 31, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 440, + line: 20, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 444, + line: 20, + col: 31, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 20, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 454, + line: 20, + col: 41, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 20, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 454, + line: 20, + col: 41, + }, + }, + Name: "exc_info", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 479, + line: 23, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 479, + line: 23, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 482, + line: 23, + col: 8, + }, + }, + Name: "out", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 485, + line: 23, + col: 11, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 485, + line: 23, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 493, + line: 23, + col: 19, + }, + }, + Name: "StringIO", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 500, + line: 24, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 500, + line: 24, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 503, + line: 24, + col: 8, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 506, + line: 24, + col: 11, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 522, + line: 24, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 530, + line: 24, + col: 35, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 506, + line: 24, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 521, + line: 24, + col: 26, + }, + }, + Name: "SuppressedFlask", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 536, + line: 25, + col: 5, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 537, + line: 25, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 540, + line: 25, + col: 9, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 536, + line: 25, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 539, + line: 25, + col: 8, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 536, + line: 25, + col: 5, + }, + }, + Name: "logger_name", + }, + ], + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 554, + line: 25, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 601, + line: 25, + col: 70, + }, + }, + Format: "", + Value: "flask_tests/test_suppressed_exception_logging", + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 606, + line: 26, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 606, + line: 26, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 628, + line: 26, + col: 27, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 642, + line: 26, + col: 41, + }, + end: { '@type': "uast:Position", + offset: 645, + line: 26, + col: 44, + }, + }, + Name: "out", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 628, + line: 26, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 641, + line: 26, + col: 40, + }, + }, + Name: "StreamHandler", + }, + keywords: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 607, + line: 26, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 610, + line: 26, + col: 9, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 606, + line: 26, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 609, + line: 26, + col: 8, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 610, + line: 26, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 616, + line: 26, + col: 15, + }, + }, + Name: "logger", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 606, + line: 26, + col: 5, + }, + }, + Name: "addHandler", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 653, + line: 28, + col: 5, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 694, + line: 30, + col: 9, + }, + }, + value: { '@type': "BinOp", + '@role': [Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 694, + line: 30, + col: 9, + }, + }, + left: { '@type': "Num", + '@token': 1, + '@role': [Binary, Expression, Left, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 694, + line: 30, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 695, + line: 30, + col: 10, + }, + }, + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 648, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 648, + line: 27, + col: 1, + }, + }, + lines: [], + }, + }, + op: { '@type': "FloorDiv", + '@token': "//", + '@role': [Arithmetic, Binary, Divide, Incomplete, Operator], + '@pos': { '@type': "uast:Positions", + }, + }, + right: { '@type': "Num", + '@token': 0, + '@role': [Binary, Expression, Literal, Number, Primitive, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 699, + line: 30, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 700, + line: 30, + col: 15, + }, + }, + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 706, + line: 32, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 706, + line: 32, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 708, + line: 32, + col: 7, + }, + }, + Name: "rv", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 711, + line: 32, + col: 10, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 733, + line: 32, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 736, + line: 32, + col: 35, + }, + }, + Format: "", + Value: "/", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 712, + line: 32, + col: 11, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 711, + line: 32, + col: 10, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 712, + line: 32, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 715, + line: 32, + col: 14, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 711, + line: 32, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 714, + line: 32, + col: 13, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 711, + line: 32, + col: 10, + }, + }, + Name: "test_client", + }, + ], + }, + keywords: [], + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 711, + line: 32, + col: 10, + }, + }, + Name: "get", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 742, + line: 33, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 748, + line: 33, + col: 11, + }, + }, + msg: ~, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 749, + line: 33, + col: 12, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "Num", + '@token': 500, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 767, + line: 33, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 770, + line: 33, + col: 33, + }, + }, + }, + ], + }, + left: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 750, + line: 33, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 752, + line: 33, + col: 15, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 749, + line: 33, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 751, + line: 33, + col: 14, + }, + }, + Name: "rv", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 749, + line: 33, + col: 12, + }, + }, + Name: "status_code", + }, + ], + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 775, + line: 34, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 781, + line: 34, + col: 11, + }, + }, + msg: ~, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 782, + line: 34, + col: 12, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 811, + line: 34, + col: 41, + }, + end: { '@type': "uast:Position", + offset: 813, + line: 34, + col: 43, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 810, + line: 34, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 812, + line: 34, + col: 42, + }, + }, + Name: "rv", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 810, + line: 34, + col: 40, + }, + }, + Name: "data", + }, + ], + }, + ], + }, + left: { '@type': "uast:String", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 782, + line: 34, + col: 12, + }, + }, + Format: "", + Value: "Internal Server Error", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "In", + '@token': "in", + '@role': [Contains, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 823, + line: 36, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 823, + line: 36, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 826, + line: 36, + col: 8, + }, + }, + Name: "err", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 829, + line: 36, + col: 11, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 830, + line: 36, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 833, + line: 36, + col: 15, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 829, + line: 36, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 832, + line: 36, + col: 14, + }, + }, + Name: "out", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 829, + line: 36, + col: 11, + }, + }, + Name: "getvalue", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 848, + line: 37, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 854, + line: 37, + col: 11, + }, + }, + msg: ~, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 855, + line: 37, + col: 12, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 862, + line: 37, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 864, + line: 37, + col: 21, + }, + }, + Format: "", + Value: "", + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 855, + line: 37, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 858, + line: 37, + col: 15, + }, + }, + Name: "err", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_94_dst.uast b/uast/diff/testdata/testcase_94_dst.uast new file mode 100644 index 00000000..d23ded90 --- /dev/null +++ b/uast/diff/testdata/testcase_94_dst.uast @@ -0,0 +1,999 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 244, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 247, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n tests.subclassing\n ~~~~~~~~~~~~~~~~~\n\n Test that certain behavior of flask can be customized by\n subclasses.\n\n :copyright: (c) 2015 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 249, + line: 13, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flask", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 248, + line: 12, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 248, + line: 12, + col: 1, + }, + }, + lines: [], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 263, + line: 15, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "StringIO", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask._compat", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 304, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 337, + line: 18, + col: 38, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "test_suppressed_exception_logging", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "ClassDef", + '@token': "SuppressedFlask", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 351, + line: 19, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 366, + line: 19, + col: 26, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 368, + line: 19, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 373, + line: 19, + col: 33, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 367, + line: 19, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 372, + line: 19, + col: 32, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 367, + line: 19, + col: 27, + }, + }, + Name: "Flask", + }, + ], + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 393, + line: 20, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 406, + line: 20, + col: 26, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "log_exception", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Pass", + '@token': "pass", + '@role': [Noop, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 436, + line: 21, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 440, + line: 21, + col: 17, + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 407, + line: 20, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 411, + line: 20, + col: 31, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 407, + line: 20, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 411, + line: 20, + col: 31, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 413, + line: 20, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 421, + line: 20, + col: 41, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 413, + line: 20, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 421, + line: 20, + col: 41, + }, + }, + Name: "exc_info", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 23, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 23, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 449, + line: 23, + col: 8, + }, + }, + Name: "out", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 452, + line: 23, + col: 11, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 452, + line: 23, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 460, + line: 23, + col: 19, + }, + }, + Name: "StringIO", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 467, + line: 24, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 467, + line: 24, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 470, + line: 24, + col: 8, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 473, + line: 24, + col: 11, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 489, + line: 24, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 497, + line: 24, + col: 35, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 473, + line: 24, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 488, + line: 24, + col: 26, + }, + }, + Name: "SuppressedFlask", + }, + keywords: [], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 504, + line: 26, + col: 5, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Raise", + '@token': "raise", + '@role': [Statement, Throw], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 545, + line: 28, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 550, + line: 28, + col: 14, + }, + }, + cause: ~, + exc: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 551, + line: 28, + col: 15, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 561, + line: 28, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 567, + line: 28, + col: 31, + }, + }, + Format: "", + Value: "test", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 551, + line: 28, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 560, + line: 28, + col: 24, + }, + }, + Name: "Exception", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 574, + line: 30, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 574, + line: 30, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 576, + line: 30, + col: 7, + }, + }, + Name: "rv", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 579, + line: 30, + col: 10, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 601, + line: 30, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 604, + line: 30, + col: 35, + }, + }, + Format: "", + Value: "/", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 580, + line: 30, + col: 11, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 579, + line: 30, + col: 10, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 580, + line: 30, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 583, + line: 30, + col: 14, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 579, + line: 30, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 582, + line: 30, + col: 13, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 579, + line: 30, + col: 10, + }, + }, + Name: "test_client", + }, + ], + }, + keywords: [], + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 579, + line: 30, + col: 10, + }, + }, + Name: "get", + }, + ], + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "errors_stream", + }, + value: { '@type': "uast:Identifier", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 620, + line: 30, + col: 51, + }, + end: { '@type': "uast:Position", + offset: 623, + line: 30, + col: 54, + }, + }, + Name: "out", + }, + }, + ], + }, + }, + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 629, + line: 31, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 635, + line: 31, + col: 11, + }, + }, + msg: ~, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 636, + line: 31, + col: 12, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "Num", + '@token': 500, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 654, + line: 31, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 657, + line: 31, + col: 33, + }, + }, + }, + ], + }, + left: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 637, + line: 31, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 639, + line: 31, + col: 15, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 636, + line: 31, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 638, + line: 31, + col: 14, + }, + }, + Name: "rv", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 636, + line: 31, + col: 12, + }, + }, + Name: "status_code", + }, + ], + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 662, + line: 32, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 668, + line: 32, + col: 11, + }, + }, + msg: ~, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 669, + line: 32, + col: 12, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 698, + line: 32, + col: 41, + }, + end: { '@type': "uast:Position", + offset: 700, + line: 32, + col: 43, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 697, + line: 32, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 699, + line: 32, + col: 42, + }, + }, + Name: "rv", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 697, + line: 32, + col: 40, + }, + }, + Name: "data", + }, + ], + }, + ], + }, + left: { '@type': "uast:String", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 669, + line: 32, + col: 12, + }, + }, + Format: "", + Value: "Internal Server Error", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "In", + '@token': "in", + '@role': [Contains, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 709, + line: 33, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 715, + line: 33, + col: 11, + }, + }, + msg: ~, + test: { '@type': "UnaryOp", + '@role': [Boolean, Expression, Operator, Unary], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 716, + line: 33, + col: 12, + }, + }, + op: { '@type': "Not", + '@token': "not", + '@role': [Boolean, Not, Operator], + '@pos': { '@type': "uast:Positions", + }, + }, + operand: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 720, + line: 33, + col: 16, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 721, + line: 33, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 724, + line: 33, + col: 20, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 720, + line: 33, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 723, + line: 33, + col: 19, + }, + }, + Name: "out", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 720, + line: 33, + col: 16, + }, + }, + Name: "getvalue", + }, + ], + }, + keywords: [], + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_94_src.uast b/uast/diff/testdata/testcase_94_src.uast new file mode 100644 index 00000000..d75a9afc --- /dev/null +++ b/uast/diff/testdata/testcase_94_src.uast @@ -0,0 +1,1266 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 244, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 247, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n tests.subclassing\n ~~~~~~~~~~~~~~~~~\n\n Test that certain behavior of flask can be customized by\n subclasses.\n\n :copyright: (c) 2015 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 248, + line: 12, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flask", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 261, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 273, + line: 13, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "StreamHandler", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "logging", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 296, + line: 15, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "StringIO", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask._compat", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 337, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 370, + line: 18, + col: 38, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "test_suppressed_exception_logging", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "ClassDef", + '@token': "SuppressedFlask", + '@role': [Declaration, Identifier, Statement, Type], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 384, + line: 19, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 399, + line: 19, + col: 26, + }, + }, + bases: { '@type': "ClassDef.bases", + '@role': [Base, Declaration, Type], + bases: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 401, + line: 19, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 406, + line: 19, + col: 33, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 400, + line: 19, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 405, + line: 19, + col: 32, + }, + }, + Name: "flask", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 400, + line: 19, + col: 27, + }, + }, + Name: "Flask", + }, + ], + }, + ], + }, + body: { '@type': "ClassDef.body", + '@role': [Body, Declaration, Type], + 'body_stmts': [ + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 426, + line: 20, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 439, + line: 20, + col: 26, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "log_exception", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Pass", + '@token': "pass", + '@role': [Noop, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 469, + line: 21, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 473, + line: 21, + col: 17, + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 440, + line: 20, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 444, + line: 20, + col: 31, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 440, + line: 20, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 444, + line: 20, + col: 31, + }, + }, + Name: "self", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 20, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 454, + line: 20, + col: 41, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 446, + line: 20, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 454, + line: 20, + col: 41, + }, + }, + Name: "exc_info", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + ], + }, + 'decorator_list': { '@type': "ClassDef.decorator_list", + '@role': [Call, Declaration, Incomplete, Type], + decorators: [], + }, + keywords: [], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 479, + line: 23, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 479, + line: 23, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 482, + line: 23, + col: 8, + }, + }, + Name: "out", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 485, + line: 23, + col: 11, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 485, + line: 23, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 493, + line: 23, + col: 19, + }, + }, + Name: "StringIO", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 500, + line: 24, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 500, + line: 24, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 503, + line: 24, + col: 8, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 506, + line: 24, + col: 11, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 522, + line: 24, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 530, + line: 24, + col: 35, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 506, + line: 24, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 521, + line: 24, + col: 26, + }, + }, + Name: "SuppressedFlask", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 536, + line: 25, + col: 5, + }, + }, + targets: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 537, + line: 25, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 540, + line: 25, + col: 9, + }, + }, + ctx: "Store", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 536, + line: 25, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 539, + line: 25, + col: 8, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 536, + line: 25, + col: 5, + }, + }, + Name: "logger_name", + }, + ], + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 554, + line: 25, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 601, + line: 25, + col: 70, + }, + }, + Format: "", + Value: "flask_tests/test_suppressed_exception_logging", + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 606, + line: 26, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 606, + line: 26, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 628, + line: 26, + col: 27, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 642, + line: 26, + col: 41, + }, + end: { '@type': "uast:Position", + offset: 645, + line: 26, + col: 44, + }, + }, + Name: "out", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 628, + line: 26, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 641, + line: 26, + col: 40, + }, + }, + Name: "StreamHandler", + }, + keywords: [], + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 607, + line: 26, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 610, + line: 26, + col: 9, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 606, + line: 26, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 609, + line: 26, + col: 8, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 610, + line: 26, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 616, + line: 26, + col: 15, + }, + }, + Name: "logger", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 606, + line: 26, + col: 5, + }, + }, + Name: "addHandler", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 653, + line: 28, + col: 5, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 694, + line: 30, + col: 9, + }, + }, + value: { '@type': "BinOp", + '@role': [Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 694, + line: 30, + col: 9, + }, + }, + left: { '@type': "Num", + '@token': 1, + '@role': [Binary, Expression, Left, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 694, + line: 30, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 695, + line: 30, + col: 10, + }, + }, + 'noops_previous': { '@type': "PreviousNoops", + '@role': [Noop], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 648, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 648, + line: 27, + col: 1, + }, + }, + lines: [], + }, + }, + op: { '@type': "FloorDiv", + '@token': "//", + '@role': [Arithmetic, Binary, Divide, Incomplete, Operator], + '@pos': { '@type': "uast:Positions", + }, + }, + right: { '@type': "Num", + '@token': 0, + '@role': [Binary, Expression, Literal, Number, Primitive, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 699, + line: 30, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 700, + line: 30, + col: 15, + }, + }, + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 706, + line: 32, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 706, + line: 32, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 708, + line: 32, + col: 7, + }, + }, + Name: "rv", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 711, + line: 32, + col: 10, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 733, + line: 32, + col: 32, + }, + end: { '@type': "uast:Position", + offset: 736, + line: 32, + col: 35, + }, + }, + Format: "", + Value: "/", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 712, + line: 32, + col: 11, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 711, + line: 32, + col: 10, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 712, + line: 32, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 715, + line: 32, + col: 14, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 711, + line: 32, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 714, + line: 32, + col: 13, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 711, + line: 32, + col: 10, + }, + }, + Name: "test_client", + }, + ], + }, + keywords: [], + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 711, + line: 32, + col: 10, + }, + }, + Name: "get", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 742, + line: 33, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 748, + line: 33, + col: 11, + }, + }, + msg: ~, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 749, + line: 33, + col: 12, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "Num", + '@token': 500, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 767, + line: 33, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 770, + line: 33, + col: 33, + }, + }, + }, + ], + }, + left: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Left, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 750, + line: 33, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 752, + line: 33, + col: 15, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 749, + line: 33, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 751, + line: 33, + col: 14, + }, + }, + Name: "rv", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 749, + line: 33, + col: 12, + }, + }, + Name: "status_code", + }, + ], + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 775, + line: 34, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 781, + line: 34, + col: 11, + }, + }, + msg: ~, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 782, + line: 34, + col: 12, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 811, + line: 34, + col: 41, + }, + end: { '@type': "uast:Position", + offset: 813, + line: 34, + col: 43, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 810, + line: 34, + col: 40, + }, + end: { '@type': "uast:Position", + offset: 812, + line: 34, + col: 42, + }, + }, + Name: "rv", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 810, + line: 34, + col: 40, + }, + }, + Name: "data", + }, + ], + }, + ], + }, + left: { '@type': "uast:String", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 782, + line: 34, + col: 12, + }, + }, + Format: "", + Value: "Internal Server Error", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "In", + '@token': "in", + '@role': [Contains, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 823, + line: 36, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 823, + line: 36, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 826, + line: 36, + col: 8, + }, + }, + Name: "err", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 829, + line: 36, + col: 11, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 830, + line: 36, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 833, + line: 36, + col: 15, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 829, + line: 36, + col: 11, + }, + end: { '@type': "uast:Position", + offset: 832, + line: 36, + col: 14, + }, + }, + Name: "out", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 829, + line: 36, + col: 11, + }, + }, + Name: "getvalue", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Assert", + '@token': "assert", + '@role': [Assert, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 848, + line: 37, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 854, + line: 37, + col: 11, + }, + }, + msg: ~, + test: { '@type': "Compare", + '@role': [Binary, Condition, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 855, + line: 37, + col: 12, + }, + }, + comparators: { '@type': "Compare.comparators", + '@role': [Expression, Right], + comparators: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 862, + line: 37, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 864, + line: 37, + col: 21, + }, + }, + Format: "", + Value: "", + }, + ], + }, + left: { '@type': "uast:Identifier", + '@role': [Expression, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 855, + line: 37, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 858, + line: 37, + col: 15, + }, + }, + Name: "err", + }, + ops: { '@type': "Compare.ops", + '@role': [Expression], + ops: [ + { '@type': "Eq", + '@token': "==", + '@role': [Equal, Operator, Relational], + '@pos': { '@type': "uast:Positions", + }, + }, + ], + }, + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_95_dst.uast b/uast/diff/testdata/testcase_95_dst.uast new file mode 100644 index 00000000..fa52dabf --- /dev/null +++ b/uast/diff/testdata/testcase_95_dst.uast @@ -0,0 +1,1262 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 10, + line: 1, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 51, + line: 4, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 51, + line: 4, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 54, + line: 4, + col: 4, + }, + }, + Name: "mod", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 4, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 64, + line: 4, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 72, + line: 4, + col: 22, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 4, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 63, + line: 4, + col: 13, + }, + }, + Name: "Module", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 74, + line: 5, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 74, + line: 5, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 78, + line: 5, + col: 5, + }, + }, + Name: "mod2", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 81, + line: 5, + col: 8, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 88, + line: 5, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 96, + line: 5, + col: 23, + }, + }, + Name: "__name__", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 98, + line: 5, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 108, + line: 5, + col: 35, + }, + }, + Format: "", + Value: "testmod2", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 81, + line: 5, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 87, + line: 5, + col: 14, + }, + }, + Name: "Module", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 110, + line: 6, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 110, + line: 6, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 114, + line: 6, + col: 5, + }, + }, + Name: "mod3", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 117, + line: 6, + col: 8, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 124, + line: 6, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 132, + line: 6, + col: 23, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 117, + line: 6, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 123, + line: 6, + col: 14, + }, + }, + Name: "Module", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "name", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 139, + line: 6, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 148, + line: 6, + col: 39, + }, + }, + Format: "", + Value: "somemod", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "subdomain", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 160, + line: 6, + col: 51, + }, + end: { '@type': "uast:Position", + offset: 165, + line: 6, + col: 56, + }, + }, + Format: "", + Value: "meh", + }, + }, + ], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 174, + line: 9, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 187, + line: 9, + col: 19, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "after_request", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 221, + line: 11, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 221, + line: 11, + col: 5, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 222, + line: 11, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 223, + line: 11, + col: 7, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 221, + line: 11, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 222, + line: 11, + col: 6, + }, + }, + Name: "g", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 223, + line: 11, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 225, + line: 11, + col: 9, + }, + }, + Name: "db", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 221, + line: 11, + col: 5, + }, + }, + Name: "close", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 238, + line: 12, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 244, + line: 12, + col: 11, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 245, + line: 12, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 253, + line: 12, + col: 20, + }, + }, + Name: "response", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 206, + line: 10, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 214, + line: 10, + col: 27, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 206, + line: 10, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 214, + line: 10, + col: 27, + }, + }, + Name: "response", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 256, + line: 15, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 289, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 295, + line: 17, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 296, + line: 17, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 312, + line: 17, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 329, + line: 17, + col: 45, + }, + }, + Format: "", + Value: "test/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 296, + line: 17, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 311, + line: 17, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 333, + line: 20, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "mod2_index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 372, + line: 22, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 378, + line: 22, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 379, + line: 22, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 395, + line: 22, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 416, + line: 22, + col: 49, + }, + }, + Format: "", + Value: "testmod2/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 379, + line: 22, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 394, + line: 22, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 420, + line: 25, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "mod3_index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 459, + line: 27, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 465, + line: 27, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 466, + line: 27, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 482, + line: 27, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 509, + line: 27, + col: 55, + }, + }, + Format: "", + Value: "something-else/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 466, + line: 27, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 481, + line: 27, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 513, + line: 30, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 513, + line: 30, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 516, + line: 30, + col: 4, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 519, + line: 30, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 525, + line: 30, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 533, + line: 30, + col: 21, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 519, + line: 30, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 524, + line: 30, + col: 12, + }, + }, + Name: "Flask", + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 535, + line: 31, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 535, + line: 31, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 555, + line: 31, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 558, + line: 31, + col: 24, + }, + }, + Name: "mod", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 536, + line: 31, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 539, + line: 31, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 535, + line: 31, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 538, + line: 31, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 535, + line: 31, + col: 1, + }, + }, + Name: "register_module", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 560, + line: 32, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 560, + line: 32, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 580, + line: 32, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 584, + line: 32, + col: 25, + }, + }, + Name: "mod2", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 561, + line: 32, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 564, + line: 32, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 560, + line: 32, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 563, + line: 32, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 560, + line: 32, + col: 1, + }, + }, + Name: "register_module", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 592, + line: 35, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 602, + line: 35, + col: 15, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "handle_404", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 615, + line: 36, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 621, + line: 36, + col: 11, + }, + }, + value: { '@type': "Tuple", + '@role': [Expression, Literal, Primitive, Tuple], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 622, + line: 36, + col: 12, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 622, + line: 36, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 631, + line: 36, + col: 21, + }, + }, + Format: "", + Value: "Testing", + }, + { '@type': "Num", + '@token': 404, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 633, + line: 36, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 636, + line: 36, + col: 26, + }, + }, + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 603, + line: 35, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 608, + line: 35, + col: 21, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 603, + line: 35, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 608, + line: 35, + col: 21, + }, + }, + Name: "error", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 637, + line: 37, + col: 1, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 637, + line: 37, + col: 1, + }, + }, + ctx: "Store", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "Num", + '@token': 404, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 656, + line: 37, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 659, + line: 37, + col: 23, + }, + }, + }, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 638, + line: 37, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 641, + line: 37, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 637, + line: 37, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 640, + line: 37, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 637, + line: 37, + col: 1, + }, + }, + Name: "error_handlers", + }, + ], + }, + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 663, + line: 37, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 673, + line: 37, + col: 37, + }, + }, + Name: "handle_404", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_95_src.uast b/uast/diff/testdata/testcase_95_src.uast new file mode 100644 index 00000000..477da42b --- /dev/null +++ b/uast/diff/testdata/testcase_95_src.uast @@ -0,0 +1,1254 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 10, + line: 1, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 34, + line: 4, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 34, + line: 4, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 37, + line: 4, + col: 4, + }, + }, + Name: "mod", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 40, + line: 4, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 47, + line: 4, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 55, + line: 4, + col: 22, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 40, + line: 4, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 46, + line: 4, + col: 13, + }, + }, + Name: "Module", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 5, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 5, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 61, + line: 5, + col: 5, + }, + }, + Name: "mod2", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 64, + line: 5, + col: 8, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 71, + line: 5, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 79, + line: 5, + col: 23, + }, + }, + Name: "__name__", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 81, + line: 5, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 91, + line: 5, + col: 35, + }, + }, + Format: "", + Value: "testmod2", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 64, + line: 5, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 70, + line: 5, + col: 14, + }, + }, + Name: "Module", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 93, + line: 6, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 93, + line: 6, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 97, + line: 6, + col: 5, + }, + }, + Name: "mod3", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 100, + line: 6, + col: 8, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 107, + line: 6, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 115, + line: 6, + col: 23, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 100, + line: 6, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 106, + line: 6, + col: 14, + }, + }, + Name: "Module", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "name", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 122, + line: 6, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 131, + line: 6, + col: 39, + }, + }, + Format: "", + Value: "somemod", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "subdomain", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 143, + line: 6, + col: 51, + }, + end: { '@type': "uast:Position", + offset: 148, + line: 6, + col: 56, + }, + }, + Format: "", + Value: "meh", + }, + }, + ], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 151, + line: 8, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 151, + line: 8, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 154, + line: 8, + col: 4, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 157, + line: 8, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 163, + line: 8, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 171, + line: 8, + col: 21, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 157, + line: 8, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 162, + line: 8, + col: 12, + }, + }, + Name: "Flask", + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 173, + line: 9, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 173, + line: 9, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 193, + line: 9, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 196, + line: 9, + col: 24, + }, + }, + Name: "mod", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 174, + line: 9, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 177, + line: 9, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 173, + line: 9, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 176, + line: 9, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 173, + line: 9, + col: 1, + }, + }, + Name: "register_module", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 198, + line: 10, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 198, + line: 10, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 218, + line: 10, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 222, + line: 10, + col: 25, + }, + }, + Name: "mod2", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 199, + line: 10, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 202, + line: 10, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 198, + line: 10, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 201, + line: 10, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 198, + line: 10, + col: 1, + }, + }, + Name: "register_module", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 230, + line: 13, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 240, + line: 13, + col: 15, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "handle_404", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 253, + line: 14, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 259, + line: 14, + col: 11, + }, + }, + value: { '@type': "Tuple", + '@role': [Expression, Literal, Primitive, Tuple], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 260, + line: 14, + col: 12, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 260, + line: 14, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 269, + line: 14, + col: 21, + }, + }, + Format: "", + Value: "Testing", + }, + { '@type': "Num", + '@token': 404, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 14, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 274, + line: 14, + col: 26, + }, + }, + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 241, + line: 13, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 246, + line: 13, + col: 21, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 241, + line: 13, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 246, + line: 13, + col: 21, + }, + }, + Name: "error", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 275, + line: 15, + col: 1, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 275, + line: 15, + col: 1, + }, + }, + ctx: "Store", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "Num", + '@token': 404, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 294, + line: 15, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 297, + line: 15, + col: 23, + }, + }, + }, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 276, + line: 15, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 279, + line: 15, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 275, + line: 15, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 278, + line: 15, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 275, + line: 15, + col: 1, + }, + }, + Name: "error_handlers", + }, + ], + }, + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 301, + line: 15, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 311, + line: 15, + col: 37, + }, + }, + Name: "handle_404", + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 319, + line: 18, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 332, + line: 18, + col: 19, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "after_request", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 366, + line: 20, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 366, + line: 20, + col: 5, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 367, + line: 20, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 368, + line: 20, + col: 7, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 366, + line: 20, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 367, + line: 20, + col: 6, + }, + }, + Name: "g", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 368, + line: 20, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 370, + line: 20, + col: 9, + }, + }, + Name: "db", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 366, + line: 20, + col: 5, + }, + }, + Name: "close", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 383, + line: 21, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 389, + line: 21, + col: 11, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 390, + line: 21, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 398, + line: 21, + col: 20, + }, + }, + Name: "response", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 351, + line: 19, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 359, + line: 19, + col: 27, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 351, + line: 19, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 359, + line: 19, + col: 27, + }, + }, + Name: "response", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 401, + line: 24, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 434, + line: 26, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 440, + line: 26, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 441, + line: 26, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 457, + line: 26, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 474, + line: 26, + col: 45, + }, + }, + Format: "", + Value: "test/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 441, + line: 26, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 456, + line: 26, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 478, + line: 29, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 512, + line: 31, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 518, + line: 31, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 519, + line: 31, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 535, + line: 31, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 556, + line: 31, + col: 49, + }, + }, + Format: "", + Value: "testmod2/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 519, + line: 31, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 534, + line: 31, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 560, + line: 34, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 594, + line: 36, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 600, + line: 36, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 601, + line: 36, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 617, + line: 36, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 644, + line: 36, + col: 55, + }, + }, + Format: "", + Value: "something-else/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 601, + line: 36, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 616, + line: 36, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_96_dst.uast b/uast/diff/testdata/testcase_96_dst.uast new file mode 100644 index 00000000..c98d968c --- /dev/null +++ b/uast/diff/testdata/testcase_96_dst.uast @@ -0,0 +1,1657 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 10, + line: 1, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 60, + line: 4, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 60, + line: 4, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 63, + line: 4, + col: 4, + }, + }, + Name: "mod", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 66, + line: 4, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 73, + line: 4, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 81, + line: 4, + col: 22, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 66, + line: 4, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 72, + line: 4, + col: 13, + }, + }, + Name: "Module", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 83, + line: 5, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 83, + line: 5, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 87, + line: 5, + col: 5, + }, + }, + Name: "mod2", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 90, + line: 5, + col: 8, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 97, + line: 5, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 105, + line: 5, + col: 23, + }, + }, + Name: "__name__", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 107, + line: 5, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 117, + line: 5, + col: 35, + }, + }, + Format: "", + Value: "testmod2", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 90, + line: 5, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 96, + line: 5, + col: 14, + }, + }, + Name: "Module", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 119, + line: 6, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 119, + line: 6, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 123, + line: 6, + col: 5, + }, + }, + Name: "mod3", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 126, + line: 6, + col: 8, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 133, + line: 6, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 141, + line: 6, + col: 23, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 126, + line: 6, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 132, + line: 6, + col: 14, + }, + }, + Name: "Module", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "name", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 148, + line: 6, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 157, + line: 6, + col: 39, + }, + }, + Format: "", + Value: "somemod", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "subdomain", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 169, + line: 6, + col: 51, + }, + end: { '@type': "uast:Position", + offset: 174, + line: 6, + col: 56, + }, + }, + Format: "", + Value: "meh", + }, + }, + ], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 183, + line: 9, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 196, + line: 9, + col: 19, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "after_request", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 230, + line: 11, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 230, + line: 11, + col: 5, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 231, + line: 11, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 232, + line: 11, + col: 7, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 230, + line: 11, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 231, + line: 11, + col: 6, + }, + }, + Name: "g", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 232, + line: 11, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 234, + line: 11, + col: 9, + }, + }, + Name: "db", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 230, + line: 11, + col: 5, + }, + }, + Name: "close", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 247, + line: 12, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 253, + line: 12, + col: 11, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 254, + line: 12, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 262, + line: 12, + col: 20, + }, + }, + Name: "response", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 215, + line: 10, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 223, + line: 10, + col: 27, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 215, + line: 10, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 223, + line: 10, + col: 27, + }, + }, + Name: "response", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 265, + line: 15, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index_foo", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 302, + line: 17, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 302, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 304, + line: 17, + col: 7, + }, + }, + Name: "x1", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 307, + line: 17, + col: 10, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 315, + line: 17, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 330, + line: 17, + col: 33, + }, + }, + Format: "", + Value: "somemod.index", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 307, + line: 17, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 314, + line: 17, + col: 17, + }, + }, + Name: "url_for", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 336, + line: 18, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 336, + line: 18, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 338, + line: 18, + col: 7, + }, + }, + Name: "x2", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 341, + line: 18, + col: 10, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 349, + line: 18, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 357, + line: 18, + col: 26, + }, + }, + Format: "", + Value: ".index", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 341, + line: 18, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 348, + line: 18, + col: 17, + }, + }, + Name: "url_for", + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 363, + line: 19, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 369, + line: 19, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 370, + line: 19, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 386, + line: 19, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 403, + line: 19, + col: 45, + }, + }, + Format: "", + Value: "test/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 370, + line: 19, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 385, + line: 19, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 407, + line: 22, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 440, + line: 24, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 440, + line: 24, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 442, + line: 24, + col: 7, + }, + }, + Name: "x1", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 445, + line: 24, + col: 10, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 453, + line: 24, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 468, + line: 24, + col: 33, + }, + }, + Format: "", + Value: "somemod.index", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 445, + line: 24, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 452, + line: 24, + col: 17, + }, + }, + Name: "url_for", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 474, + line: 25, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 474, + line: 25, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 476, + line: 25, + col: 7, + }, + }, + Name: "x2", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 479, + line: 25, + col: 10, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 487, + line: 25, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 495, + line: 25, + col: 26, + }, + }, + Format: "", + Value: ".index", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 479, + line: 25, + col: 10, + }, + end: { '@type': "uast:Position", + offset: 486, + line: 25, + col: 17, + }, + }, + Name: "url_for", + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 501, + line: 26, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 507, + line: 26, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 508, + line: 26, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 524, + line: 26, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 541, + line: 26, + col: 45, + }, + }, + Format: "", + Value: "test/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 508, + line: 26, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 523, + line: 26, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 545, + line: 29, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "mod2_index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 584, + line: 31, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 590, + line: 31, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 591, + line: 31, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 607, + line: 31, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 628, + line: 31, + col: 49, + }, + }, + Format: "", + Value: "testmod2/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 591, + line: 31, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 606, + line: 31, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 632, + line: 34, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "mod3_index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 671, + line: 36, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 677, + line: 36, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 678, + line: 36, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 694, + line: 36, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 721, + line: 36, + col: 55, + }, + }, + Format: "", + Value: "something-else/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 678, + line: 36, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 693, + line: 36, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 725, + line: 39, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 725, + line: 39, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 728, + line: 39, + col: 4, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 731, + line: 39, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 737, + line: 39, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 745, + line: 39, + col: 21, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 731, + line: 39, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 736, + line: 39, + col: 12, + }, + }, + Name: "Flask", + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 747, + line: 40, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 747, + line: 40, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 767, + line: 40, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 770, + line: 40, + col: 24, + }, + }, + Name: "mod", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 748, + line: 40, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 751, + line: 40, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 747, + line: 40, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 750, + line: 40, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 747, + line: 40, + col: 1, + }, + }, + Name: "register_module", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 772, + line: 41, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 772, + line: 41, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 792, + line: 41, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 796, + line: 41, + col: 25, + }, + }, + Name: "mod2", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 773, + line: 41, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 776, + line: 41, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 772, + line: 41, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 775, + line: 41, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 772, + line: 41, + col: 1, + }, + }, + Name: "register_module", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 804, + line: 44, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 814, + line: 44, + col: 15, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "handle_404", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 827, + line: 45, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 833, + line: 45, + col: 11, + }, + }, + value: { '@type': "Tuple", + '@role': [Expression, Literal, Primitive, Tuple], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 834, + line: 45, + col: 12, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 834, + line: 45, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 843, + line: 45, + col: 21, + }, + }, + Format: "", + Value: "Testing", + }, + { '@type': "Num", + '@token': 404, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 845, + line: 45, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 848, + line: 45, + col: 26, + }, + }, + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 815, + line: 44, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 820, + line: 44, + col: 21, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 815, + line: 44, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 820, + line: 44, + col: 21, + }, + }, + Name: "error", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 849, + line: 46, + col: 1, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 849, + line: 46, + col: 1, + }, + }, + ctx: "Store", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "Num", + '@token': 404, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 868, + line: 46, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 871, + line: 46, + col: 23, + }, + }, + }, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 850, + line: 46, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 853, + line: 46, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 849, + line: 46, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 852, + line: 46, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 849, + line: 46, + col: 1, + }, + }, + Name: "error_handlers", + }, + ], + }, + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 875, + line: 46, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 885, + line: 46, + col: 37, + }, + }, + Name: "handle_404", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_96_src.uast b/uast/diff/testdata/testcase_96_src.uast new file mode 100644 index 00000000..fa52dabf --- /dev/null +++ b/uast/diff/testdata/testcase_96_src.uast @@ -0,0 +1,1262 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 10, + line: 1, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 51, + line: 4, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 51, + line: 4, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 54, + line: 4, + col: 4, + }, + }, + Name: "mod", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 4, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 64, + line: 4, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 72, + line: 4, + col: 22, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 57, + line: 4, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 63, + line: 4, + col: 13, + }, + }, + Name: "Module", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 74, + line: 5, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 74, + line: 5, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 78, + line: 5, + col: 5, + }, + }, + Name: "mod2", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 81, + line: 5, + col: 8, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 88, + line: 5, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 96, + line: 5, + col: 23, + }, + }, + Name: "__name__", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 98, + line: 5, + col: 25, + }, + end: { '@type': "uast:Position", + offset: 108, + line: 5, + col: 35, + }, + }, + Format: "", + Value: "testmod2", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 81, + line: 5, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 87, + line: 5, + col: 14, + }, + }, + Name: "Module", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 110, + line: 6, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 110, + line: 6, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 114, + line: 6, + col: 5, + }, + }, + Name: "mod3", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 117, + line: 6, + col: 8, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 124, + line: 6, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 132, + line: 6, + col: 23, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 117, + line: 6, + col: 8, + }, + end: { '@type': "uast:Position", + offset: 123, + line: 6, + col: 14, + }, + }, + Name: "Module", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "name", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 139, + line: 6, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 148, + line: 6, + col: 39, + }, + }, + Format: "", + Value: "somemod", + }, + }, + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "subdomain", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 160, + line: 6, + col: 51, + }, + end: { '@type': "uast:Position", + offset: 165, + line: 6, + col: 56, + }, + }, + Format: "", + Value: "meh", + }, + }, + ], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 174, + line: 9, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 187, + line: 9, + col: 19, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "after_request", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 221, + line: 11, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 221, + line: 11, + col: 5, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 222, + line: 11, + col: 6, + }, + end: { '@type': "uast:Position", + offset: 223, + line: 11, + col: 7, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 221, + line: 11, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 222, + line: 11, + col: 6, + }, + }, + Name: "g", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 223, + line: 11, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 225, + line: 11, + col: 9, + }, + }, + Name: "db", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 221, + line: 11, + col: 5, + }, + }, + Name: "close", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 238, + line: 12, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 244, + line: 12, + col: 11, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 245, + line: 12, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 253, + line: 12, + col: 20, + }, + }, + Name: "response", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 206, + line: 10, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 214, + line: 10, + col: 27, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 206, + line: 10, + col: 19, + }, + end: { '@type': "uast:Position", + offset: 214, + line: 10, + col: 27, + }, + }, + Name: "response", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 256, + line: 15, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 289, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 295, + line: 17, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 296, + line: 17, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 312, + line: 17, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 329, + line: 17, + col: 45, + }, + }, + Format: "", + Value: "test/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 296, + line: 17, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 311, + line: 17, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 333, + line: 20, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "mod2_index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 372, + line: 22, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 378, + line: 22, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 379, + line: 22, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 395, + line: 22, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 416, + line: 22, + col: 49, + }, + }, + Format: "", + Value: "testmod2/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 379, + line: 22, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 394, + line: 22, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 420, + line: 25, + col: 1, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "mod3_index", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 459, + line: 27, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 465, + line: 27, + col: 11, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 466, + line: 27, + col: 12, + }, + }, + args: [ + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 482, + line: 27, + col: 28, + }, + end: { '@type': "uast:Position", + offset: 509, + line: 27, + col: 55, + }, + }, + Format: "", + Value: "something-else/index.html", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 466, + line: 27, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 481, + line: 27, + col: 27, + }, + }, + Name: "render_template", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 513, + line: 30, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 513, + line: 30, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 516, + line: 30, + col: 4, + }, + }, + Name: "app", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 519, + line: 30, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 525, + line: 30, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 533, + line: 30, + col: 21, + }, + }, + Name: "__name__", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 519, + line: 30, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 524, + line: 30, + col: 12, + }, + }, + Name: "Flask", + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 535, + line: 31, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 535, + line: 31, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 555, + line: 31, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 558, + line: 31, + col: 24, + }, + }, + Name: "mod", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 536, + line: 31, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 539, + line: 31, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 535, + line: 31, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 538, + line: 31, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 535, + line: 31, + col: 1, + }, + }, + Name: "register_module", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 560, + line: 32, + col: 1, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 560, + line: 32, + col: 1, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 580, + line: 32, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 584, + line: 32, + col: 25, + }, + }, + Name: "mod2", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 561, + line: 32, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 564, + line: 32, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 560, + line: 32, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 563, + line: 32, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 560, + line: 32, + col: 1, + }, + }, + Name: "register_module", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 592, + line: 35, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 602, + line: 35, + col: 15, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "handle_404", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 615, + line: 36, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 621, + line: 36, + col: 11, + }, + }, + value: { '@type': "Tuple", + '@role': [Expression, Literal, Primitive, Tuple], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 622, + line: 36, + col: 12, + }, + }, + ctx: "Load", + elts: [ + { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 622, + line: 36, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 631, + line: 36, + col: 21, + }, + }, + Format: "", + Value: "Testing", + }, + { '@type': "Num", + '@token': 404, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 633, + line: 36, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 636, + line: 36, + col: 26, + }, + }, + }, + ], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [ + { '@type': "uast:Argument", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 603, + line: 35, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 608, + line: 35, + col: 21, + }, + }, + Init: ~, + MapVariadic: false, + Name: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 603, + line: 35, + col: 16, + }, + end: { '@type': "uast:Position", + offset: 608, + line: 35, + col: 21, + }, + }, + Name: "error", + }, + Receiver: false, + Type: ~, + Variadic: false, + }, + ], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 637, + line: 37, + col: 1, + }, + }, + targets: [ + { '@type': "Subscript", + '@role': [Expression, Incomplete, Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 637, + line: 37, + col: 1, + }, + }, + ctx: "Store", + slice: { '@type': "Index", + '@role': [Expression, Incomplete], + '@pos': { '@type': "uast:Positions", + }, + value: { '@type': "Num", + '@token': 404, + '@role': [Expression, Literal, Number, Primitive], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 656, + line: 37, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 659, + line: 37, + col: 23, + }, + }, + }, + }, + value: { '@type': "QualifiedIdentifier", + '@role': [Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 638, + line: 37, + col: 2, + }, + end: { '@type': "uast:Position", + offset: 641, + line: 37, + col: 5, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 637, + line: 37, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 640, + line: 37, + col: 4, + }, + }, + Name: "app", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 637, + line: 37, + col: 1, + }, + }, + Name: "error_handlers", + }, + ], + }, + }, + ], + value: { '@type': "uast:Identifier", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 663, + line: 37, + col: 27, + }, + end: { '@type': "uast:Position", + offset: 673, + line: 37, + col: 37, + }, + }, + Name: "handle_404", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_97_dst.uast b/uast/diff/testdata/testcase_97_dst.uast new file mode 100644 index 00000000..b14c76c5 --- /dev/null +++ b/uast/diff/testdata/testcase_97_dst.uast @@ -0,0 +1,652 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 13, + col: 12, + }, + }, + Name: "__version__", + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 13, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 280, + line: 13, + col: 24, + }, + }, + Format: "", + Value: "0.8-dev", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 399, + line: 17, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 412, + line: 17, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 436, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 447, + line: 18, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 471, + line: 20, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 480, + line: 20, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 513, + line: 21, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 525, + line: 21, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 540, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 553, + line: 22, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 717, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 730, + line: 25, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 791, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 800, + line: 26, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 828, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 840, + line: 27, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 855, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 871, + line: 28, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 889, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 905, + line: 29, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 968, + line: 32, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 981, + line: 32, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1151, + line: 36, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1153, + line: 36, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1174, + line: 37, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1187, + line: 37, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1154, + line: 36, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1168, + line: 36, + col: 18, + }, + }, + Name: "json_available", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_97_src.uast b/uast/diff/testdata/testcase_97_src.uast new file mode 100644 index 00000000..9a42a9f4 --- /dev/null +++ b/uast/diff/testdata/testcase_97_src.uast @@ -0,0 +1,681 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 13, + col: 12, + }, + }, + Name: "__version__", + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 13, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 280, + line: 13, + col: 24, + }, + }, + Format: "", + Value: "0.8-dev", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 399, + line: 17, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 412, + line: 17, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 436, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 447, + line: 18, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 471, + line: 20, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 480, + line: 20, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 513, + line: 21, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 525, + line: 21, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 540, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 553, + line: 22, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 717, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 730, + line: 25, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 791, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 800, + line: 26, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 828, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 840, + line: 27, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 855, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 871, + line: 28, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 889, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 905, + line: 29, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 953, + line: 30, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 966, + line: 30, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Session", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../session", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 997, + line: 33, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1010, + line: 33, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1180, + line: 37, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1182, + line: 37, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1203, + line: 38, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1216, + line: 38, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1183, + line: 37, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1197, + line: 37, + col: 18, + }, + }, + Name: "json_available", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_98_dst.uast b/uast/diff/testdata/testcase_98_dst.uast new file mode 100644 index 00000000..824fef1c --- /dev/null +++ b/uast/diff/testdata/testcase_98_dst.uast @@ -0,0 +1,683 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 13, + col: 12, + }, + }, + Name: "__version__", + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 13, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 280, + line: 13, + col: 24, + }, + }, + Format: "", + Value: "0.8-dev", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 399, + line: 17, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 412, + line: 17, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 436, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 447, + line: 18, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 471, + line: 20, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 480, + line: 20, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 513, + line: 21, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 525, + line: 21, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 540, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 553, + line: 22, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 717, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 730, + line: 25, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 791, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 800, + line: 26, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 828, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 840, + line: 27, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 855, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 871, + line: 28, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 889, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 905, + line: 29, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 968, + line: 32, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 981, + line: 32, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1151, + line: 36, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1153, + line: 36, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1174, + line: 37, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1187, + line: 37, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1154, + line: 36, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1168, + line: 36, + col: 18, + }, + }, + Name: "json_available", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1238, + line: 40, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1252, + line: 40, + col: 15, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "SecureCookieSession", + }, + Node: { '@type': "uast:Identifier", + Name: "Session", + }, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../sessions", + }, + Target: ~, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_98_src.uast b/uast/diff/testdata/testcase_98_src.uast new file mode 100644 index 00000000..b14c76c5 --- /dev/null +++ b/uast/diff/testdata/testcase_98_src.uast @@ -0,0 +1,652 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 252, + line: 11, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 255, + line: 11, + col: 4, + }, + }, + Format: "", + Value: "\n flask\n ~~~~~\n\n A microframework based on Werkzeug. It's extensively documented\n and follows best practice patterns.\n\n :copyright: (c) 2010 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 257, + line: 13, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 268, + line: 13, + col: 12, + }, + }, + Name: "__version__", + }, + ], + value: { '@type': "uast:String", + '@role': [Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 271, + line: 13, + col: 15, + }, + end: { '@type': "uast:Position", + offset: 280, + line: 13, + col: 24, + }, + }, + Format: "", + Value: "0.8-dev", + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 399, + line: 17, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 412, + line: 17, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "abort", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "redirect", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "werkzeug", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 436, + line: 18, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 447, + line: 18, + col: 12, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Markup", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "escape", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "jinja2", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 471, + line: 20, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 480, + line: 20, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Flask", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Response", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../app", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 513, + line: 21, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 525, + line: 21, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Config", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../config", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 540, + line: 22, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 553, + line: 22, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "url_for", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "jsonify", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "flash", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_file", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "send_from_directory", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_flashed_messages", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "get_template_attribute", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "make_response", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "safe_join", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 717, + line: 25, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 730, + line: 25, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "current_app", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "g", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "session", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "_request_ctx_stack", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../globals", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 791, + line: 26, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 800, + line: 26, + col: 10, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "has_request_context", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../ctx", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 828, + line: 27, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 840, + line: 27, + col: 13, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../module", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 855, + line: 28, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 871, + line: 28, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Blueprint", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../blueprints", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 889, + line: 29, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 905, + line: 29, + col: 17, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "render_template_string", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../templating", + }, + Target: ~, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 968, + line: 32, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 981, + line: 32, + col: 14, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "signals_available", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "template_rendered", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_started", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_finished", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "got_request_exception", + }, + Node: {}, + }, + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "request_tearing_down", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../signals", + }, + Target: ~, + }, + { '@type': "If", + '@token': "if", + '@role': [Expression, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1151, + line: 36, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 1153, + line: 36, + col: 3, + }, + }, + body: { '@type': "If.body", + '@role': [Body, If, Then], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1174, + line: 37, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 1187, + line: 37, + col: 18, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "json", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "../helpers", + }, + Target: ~, + }, + ], + }, + orelse: { '@type': "If.orelse", + '@token': "else", + '@role': [Body, Else, If], + 'else_stmts': [], + }, + test: { '@type': "uast:Identifier", + '@role': [Condition, If], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 1154, + line: 36, + col: 4, + }, + end: { '@type': "uast:Position", + offset: 1168, + line: 36, + col: 18, + }, + }, + Name: "json_available", + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_99_dst.uast b/uast/diff/testdata/testcase_99_dst.uast new file mode 100644 index 00000000..861b8739 --- /dev/null +++ b/uast/diff/testdata/testcase_99_dst.uast @@ -0,0 +1,1128 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 205, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 208, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n flask.testsuite.examples\n ~~~~~~~~~~~~~~~~~~~~~~~~\n\n Tests the examples.\n\n :copyright: (c) 2014 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 209, + line: 11, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "os", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 219, + line: 12, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "unittest", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 235, + line: 13, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "add_to_path", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.testsuite", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 281, + line: 16, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 291, + line: 16, + col: 15, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "setup_path", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 299, + line: 17, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 299, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 311, + line: 17, + col: 17, + }, + }, + Name: "example_path", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 314, + line: 17, + col: 20, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 327, + line: 17, + col: 33, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 343, + line: 17, + col: 49, + }, + end: { '@type': "uast:Position", + offset: 351, + line: 17, + col: 57, + }, + }, + Name: "__file__", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 328, + line: 17, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 330, + line: 17, + col: 36, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 327, + line: 17, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 329, + line: 17, + col: 35, + }, + }, + Name: "os", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 330, + line: 17, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 334, + line: 17, + col: 40, + }, + }, + Name: "path", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 327, + line: 17, + col: 33, + }, + }, + Name: "dirname", + }, + ], + }, + keywords: [], + }, + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 387, + line: 18, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 389, + line: 18, + col: 36, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 386, + line: 18, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 388, + line: 18, + col: 35, + }, + }, + Name: "os", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 386, + line: 18, + col: 33, + }, + }, + Name: "pardir", + }, + ], + }, + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 398, + line: 18, + col: 45, + }, + end: { '@type': "uast:Position", + offset: 400, + line: 18, + col: 47, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 397, + line: 18, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 399, + line: 18, + col: 46, + }, + }, + Name: "os", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 397, + line: 18, + col: 44, + }, + }, + Name: "pardir", + }, + ], + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 408, + line: 18, + col: 55, + }, + end: { '@type': "uast:Position", + offset: 418, + line: 18, + col: 65, + }, + }, + Format: "", + Value: "examples", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 315, + line: 17, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 317, + line: 17, + col: 23, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 314, + line: 17, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 316, + line: 17, + col: 22, + }, + }, + Name: "os", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 317, + line: 17, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 321, + line: 17, + col: 27, + }, + }, + Name: "path", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 314, + line: 17, + col: 20, + }, + }, + Name: "join", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 424, + line: 19, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 424, + line: 19, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 436, + line: 19, + col: 17, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 449, + line: 19, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 461, + line: 19, + col: 42, + }, + }, + Name: "example_path", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 463, + line: 19, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 471, + line: 19, + col: 52, + }, + }, + Format: "", + Value: "flaskr", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 437, + line: 19, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 439, + line: 19, + col: 20, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 436, + line: 19, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 438, + line: 19, + col: 19, + }, + }, + Name: "os", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 439, + line: 19, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 443, + line: 19, + col: 24, + }, + }, + Name: "path", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 436, + line: 19, + col: 17, + }, + }, + Name: "join", + }, + ], + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 424, + line: 19, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 435, + line: 19, + col: 16, + }, + }, + Name: "add_to_path", + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 478, + line: 20, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 478, + line: 20, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 490, + line: 20, + col: 17, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 503, + line: 20, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 515, + line: 20, + col: 42, + }, + }, + Name: "example_path", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 517, + line: 20, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 527, + line: 20, + col: 54, + }, + }, + Format: "", + Value: "minitwit", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 491, + line: 20, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 493, + line: 20, + col: 20, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 490, + line: 20, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 492, + line: 20, + col: 19, + }, + }, + Name: "os", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 493, + line: 20, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 497, + line: 20, + col: 24, + }, + }, + Name: "path", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 490, + line: 20, + col: 17, + }, + }, + Name: "join", + }, + ], + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 478, + line: 20, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 489, + line: 20, + col: 16, + }, + }, + Name: "add_to_path", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 536, + line: 23, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 541, + line: 23, + col: 10, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "suite", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 549, + line: 24, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 549, + line: 24, + col: 5, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 549, + line: 24, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 559, + line: 24, + col: 15, + }, + }, + Name: "setup_path", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 566, + line: 25, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 566, + line: 25, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 571, + line: 25, + col: 10, + }, + }, + Name: "suite", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 574, + line: 25, + col: 13, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 575, + line: 25, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 583, + line: 25, + col: 22, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 574, + line: 25, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 582, + line: 25, + col: 21, + }, + }, + Name: "unittest", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 574, + line: 25, + col: 13, + }, + }, + Name: "TestSuite", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Try", + '@token': "try", + '@role': [Statement, Try], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 599, + line: 26, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 602, + line: 26, + col: 8, + }, + }, + body: { '@type': "Try.body", + '@role': [Body, Try], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 612, + line: 27, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 631, + line: 27, + col: 28, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "MiniTwitTestCase", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "minitwit_tests", + }, + Target: ~, + }, + ], + }, + finalbody: { '@type': "Try.finalbody", + '@token': "finally", + '@role': [Finally, Try], + 'final_stmts': [], + }, + handlers: { '@type': "Try.handlers", + '@token': "except", + '@role': [Catch, Try], + handlers: [ + { '@type': "ExceptHandler", + '@role': [Catch, Identifier, Try], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 660, + line: 28, + col: 5, + }, + }, + '@token': ~, + body: [ + { '@type': "Pass", + '@token': "pass", + '@role': [Noop, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 688, + line: 29, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 692, + line: 29, + col: 13, + }, + }, + }, + ], + type: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 667, + line: 28, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 678, + line: 28, + col: 23, + }, + }, + Name: "ImportError", + }, + }, + ], + }, + orelse: { '@type': "Try.else", + '@token': "else", + '@role': [Else, Try], + }, + }, + { '@type': "Try", + '@token': "try", + '@role': [Statement, Try], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 767, + line: 32, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 770, + line: 32, + col: 8, + }, + }, + body: { '@type': "Try.body", + '@role': [Body, Try], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 780, + line: 33, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 797, + line: 33, + col: 26, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "FlaskrTestCase", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flaskr_tests", + }, + Target: ~, + }, + ], + }, + finalbody: { '@type': "Try.finalbody", + '@token': "finally", + '@role': [Finally, Try], + 'final_stmts': [], + }, + handlers: { '@type': "Try.handlers", + '@token': "except", + '@role': [Catch, Try], + handlers: [ + { '@type': "ExceptHandler", + '@role': [Catch, Identifier, Try], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 824, + line: 34, + col: 5, + }, + }, + '@token': ~, + body: [ + { '@type': "Pass", + '@token': "pass", + '@role': [Noop, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 852, + line: 35, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 856, + line: 35, + col: 13, + }, + }, + }, + ], + type: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 831, + line: 34, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 842, + line: 34, + col: 23, + }, + }, + Name: "ImportError", + }, + }, + ], + }, + orelse: { '@type': "Try.else", + '@token': "else", + '@role': [Else, Try], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 929, + line: 38, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 935, + line: 38, + col: 11, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 936, + line: 38, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 941, + line: 38, + col: 17, + }, + }, + Name: "suite", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_99_src.uast b/uast/diff/testdata/testcase_99_src.uast new file mode 100644 index 00000000..9c965bd4 --- /dev/null +++ b/uast/diff/testdata/testcase_99_src.uast @@ -0,0 +1,1128 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 205, + line: 10, + col: 1, + }, + }, + value: { '@type': "uast:String", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 24, + line: 2, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 208, + line: 10, + col: 4, + }, + }, + Format: "", + Value: "\n flask.testsuite.examples\n ~~~~~~~~~~~~~~~~~~~~~~~~\n\n Tests the examples.\n\n :copyright: (c) 2011 by Armin Ronacher.\n :license: BSD, see LICENSE for more details.\n", + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 209, + line: 11, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "os", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + }, + { '@type': "Import", + '@token': "import", + '@role': [Declaration, Import, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 219, + line: 12, + col: 1, + }, + }, + names: { '@type': "ImportFrom.names", + '@role': [Identifier, Import, Incomplete, Pathname], + 'name_list': [ + { '@type': "uast:RuntimeImport", + All: false, + Names: ~, + Path: { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "unittest", + }, + Node: {}, + }, + Target: ~, + }, + ], + }, + }, + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 235, + line: 13, + col: 1, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "add_to_path", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask.testsuite", + }, + Target: ~, + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 281, + line: 16, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 291, + line: 16, + col: 15, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "setup_path", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 299, + line: 17, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 299, + line: 17, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 311, + line: 17, + col: 17, + }, + }, + Name: "example_path", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 314, + line: 17, + col: 20, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 327, + line: 17, + col: 33, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 343, + line: 17, + col: 49, + }, + end: { '@type': "uast:Position", + offset: 351, + line: 17, + col: 57, + }, + }, + Name: "__file__", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 328, + line: 17, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 330, + line: 17, + col: 36, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 327, + line: 17, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 329, + line: 17, + col: 35, + }, + }, + Name: "os", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 330, + line: 17, + col: 36, + }, + end: { '@type': "uast:Position", + offset: 334, + line: 17, + col: 40, + }, + }, + Name: "path", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 327, + line: 17, + col: 33, + }, + }, + Name: "dirname", + }, + ], + }, + keywords: [], + }, + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 387, + line: 18, + col: 34, + }, + end: { '@type': "uast:Position", + offset: 389, + line: 18, + col: 36, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 386, + line: 18, + col: 33, + }, + end: { '@type': "uast:Position", + offset: 388, + line: 18, + col: 35, + }, + }, + Name: "os", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 386, + line: 18, + col: 33, + }, + }, + Name: "pardir", + }, + ], + }, + { '@type': "QualifiedIdentifier", + '@role': [Argument, Call, Expression, Function, Identifier, Name, Positional, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 398, + line: 18, + col: 45, + }, + end: { '@type': "uast:Position", + offset: 400, + line: 18, + col: 47, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 397, + line: 18, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 399, + line: 18, + col: 46, + }, + }, + Name: "os", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 397, + line: 18, + col: 44, + }, + }, + Name: "pardir", + }, + ], + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 408, + line: 18, + col: 55, + }, + end: { '@type': "uast:Position", + offset: 418, + line: 18, + col: 65, + }, + }, + Format: "", + Value: "examples", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 315, + line: 17, + col: 21, + }, + end: { '@type': "uast:Position", + offset: 317, + line: 17, + col: 23, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 314, + line: 17, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 316, + line: 17, + col: 22, + }, + }, + Name: "os", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 317, + line: 17, + col: 23, + }, + end: { '@type': "uast:Position", + offset: 321, + line: 17, + col: 27, + }, + }, + Name: "path", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 314, + line: 17, + col: 20, + }, + }, + Name: "join", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 424, + line: 19, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 424, + line: 19, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 436, + line: 19, + col: 17, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 449, + line: 19, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 461, + line: 19, + col: 42, + }, + }, + Name: "example_path", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 463, + line: 19, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 471, + line: 19, + col: 52, + }, + }, + Format: "", + Value: "flaskr", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 437, + line: 19, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 439, + line: 19, + col: 20, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 436, + line: 19, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 438, + line: 19, + col: 19, + }, + }, + Name: "os", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 439, + line: 19, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 443, + line: 19, + col: 24, + }, + }, + Name: "path", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 436, + line: 19, + col: 17, + }, + }, + Name: "join", + }, + ], + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 424, + line: 19, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 435, + line: 19, + col: 16, + }, + }, + Name: "add_to_path", + }, + keywords: [], + }, + }, + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 478, + line: 20, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 478, + line: 20, + col: 5, + }, + }, + args: [ + { '@type': "Call", + '@role': [Argument, Call, Expression, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 490, + line: 20, + col: 17, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 503, + line: 20, + col: 30, + }, + end: { '@type': "uast:Position", + offset: 515, + line: 20, + col: 42, + }, + }, + Name: "example_path", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 517, + line: 20, + col: 44, + }, + end: { '@type': "uast:Position", + offset: 527, + line: 20, + col: 54, + }, + }, + Format: "", + Value: "minitwit", + }, + ], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 491, + line: 20, + col: 18, + }, + end: { '@type': "uast:Position", + offset: 493, + line: 20, + col: 20, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 490, + line: 20, + col: 17, + }, + end: { '@type': "uast:Position", + offset: 492, + line: 20, + col: 19, + }, + }, + Name: "os", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 493, + line: 20, + col: 20, + }, + end: { '@type': "uast:Position", + offset: 497, + line: 20, + col: 24, + }, + }, + Name: "path", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 490, + line: 20, + col: 17, + }, + }, + Name: "join", + }, + ], + }, + keywords: [], + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 478, + line: 20, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 489, + line: 20, + col: 16, + }, + }, + Name: "add_to_path", + }, + keywords: [], + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + { '@type': "uast:FunctionGroup", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 536, + line: 23, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 541, + line: 23, + col: 10, + }, + }, + Nodes: [ + { + async: false, + }, + { '@type': "uast:Alias", + Name: { '@type': "uast:Identifier", + Name: "suite", + }, + Node: { '@type': "uast:Function", + Body: { '@type': "uast:Block", + Statements: [ + { '@type': "Expr", + '@role': [Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 549, + line: 24, + col: 5, + }, + }, + value: { '@type': "Call", + '@role': [Call, Expression, Function], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 549, + line: 24, + col: 5, + }, + }, + args: [], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 549, + line: 24, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 559, + line: 24, + col: 15, + }, + }, + Name: "setup_path", + }, + keywords: [], + }, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 566, + line: 25, + col: 5, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 566, + line: 25, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 571, + line: 25, + col: 10, + }, + }, + Name: "suite", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 574, + line: 25, + col: 13, + }, + }, + args: [], + func: { '@type': "QualifiedIdentifier", + '@role': [Call, Callee, Expression, Identifier, Qualified], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 575, + line: 25, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 583, + line: 25, + col: 22, + }, + }, + ctx: "Load", + identifiers: [ + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 574, + line: 25, + col: 13, + }, + end: { '@type': "uast:Position", + offset: 582, + line: 25, + col: 21, + }, + }, + Name: "unittest", + }, + { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 574, + line: 25, + col: 13, + }, + }, + Name: "TestSuite", + }, + ], + }, + keywords: [], + }, + }, + { '@type': "Try", + '@token': "try", + '@role': [Statement, Try], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 599, + line: 26, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 602, + line: 26, + col: 8, + }, + }, + body: { '@type': "Try.body", + '@role': [Body, Try], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 612, + line: 27, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 631, + line: 27, + col: 28, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "MiniTwitTestCase", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "minitwit_tests", + }, + Target: ~, + }, + ], + }, + finalbody: { '@type': "Try.finalbody", + '@token': "finally", + '@role': [Finally, Try], + 'final_stmts': [], + }, + handlers: { '@type': "Try.handlers", + '@token': "except", + '@role': [Catch, Try], + handlers: [ + { '@type': "ExceptHandler", + '@role': [Catch, Identifier, Try], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 660, + line: 28, + col: 5, + }, + }, + '@token': ~, + body: [ + { '@type': "Pass", + '@token': "pass", + '@role': [Noop, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 688, + line: 29, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 692, + line: 29, + col: 13, + }, + }, + }, + ], + type: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 667, + line: 28, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 678, + line: 28, + col: 23, + }, + }, + Name: "ImportError", + }, + }, + ], + }, + orelse: { '@type': "Try.else", + '@token': "else", + '@role': [Else, Try], + }, + }, + { '@type': "Try", + '@token': "try", + '@role': [Statement, Try], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 767, + line: 32, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 770, + line: 32, + col: 8, + }, + }, + body: { '@type': "Try.body", + '@role': [Body, Try], + 'body_stmts': [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 780, + line: 33, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 797, + line: 33, + col: 26, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "FlaskrTestCase", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flaskr_tests", + }, + Target: ~, + }, + ], + }, + finalbody: { '@type': "Try.finalbody", + '@token': "finally", + '@role': [Finally, Try], + 'final_stmts': [], + }, + handlers: { '@type': "Try.handlers", + '@token': "except", + '@role': [Catch, Try], + handlers: [ + { '@type': "ExceptHandler", + '@role': [Catch, Identifier, Try], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 824, + line: 34, + col: 5, + }, + }, + '@token': ~, + body: [ + { '@type': "Pass", + '@token': "pass", + '@role': [Noop, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 852, + line: 35, + col: 9, + }, + end: { '@type': "uast:Position", + offset: 856, + line: 35, + col: 13, + }, + }, + }, + ], + type: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 831, + line: 34, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 842, + line: 34, + col: 23, + }, + }, + Name: "ImportError", + }, + }, + ], + }, + orelse: { '@type': "Try.else", + '@token': "else", + '@role': [Else, Try], + }, + }, + { '@type': "Return", + '@token': "return", + '@role': [Return, Statement], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 929, + line: 38, + col: 5, + }, + end: { '@type': "uast:Position", + offset: 935, + line: 38, + col: 11, + }, + }, + value: { '@type': "uast:Identifier", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 936, + line: 38, + col: 12, + }, + end: { '@type': "uast:Position", + offset: 941, + line: 38, + col: 17, + }, + }, + Name: "suite", + }, + }, + ], + }, + Type: { '@type': "uast:FunctionType", + Arguments: [], + Returns: ~, + }, + }, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_9_dst.uast b/uast/diff/testdata/testcase_9_dst.uast new file mode 100644 index 00000000..be0932b1 --- /dev/null +++ b/uast/diff/testdata/testcase_9_dst.uast @@ -0,0 +1,152 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 10, + line: 1, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 27, + line: 4, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 27, + line: 4, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 30, + line: 4, + col: 4, + }, + }, + Name: "mod", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 33, + line: 4, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 40, + line: 4, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 48, + line: 4, + col: 22, + }, + }, + Name: "__name__", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 50, + line: 4, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 55, + line: 4, + col: 29, + }, + }, + Format: "", + Value: "foo", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 33, + line: 4, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 39, + line: 4, + col: 13, + }, + }, + Name: "Module", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "subdomain", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 67, + line: 4, + col: 41, + }, + end: { '@type': "uast:Position", + offset: 72, + line: 4, + col: 46, + }, + }, + Format: "", + Value: "foo", + }, + }, + ], + }, + }, + ], +} \ No newline at end of file diff --git a/uast/diff/testdata/testcase_9_src.uast b/uast/diff/testdata/testcase_9_src.uast new file mode 100644 index 00000000..be0932b1 --- /dev/null +++ b/uast/diff/testdata/testcase_9_src.uast @@ -0,0 +1,152 @@ +{ '@type': "Module", + '@role': [File, Module], + '@pos': { '@type': "uast:Positions", + }, + body: [ + { '@type': "uast:RuntimeImport", + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 0, + line: 1, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 10, + line: 1, + col: 11, + }, + }, + All: false, + Names: [ + { '@type': "uast:Alias", + '@pos': { '@type': "uast:Positions", + }, + Name: { '@type': "uast:Identifier", + Name: "Module", + }, + Node: {}, + }, + ], + Path: { '@type': "uast:Identifier", + Name: "flask", + }, + Target: ~, + }, + { '@type': "Assign", + '@role': [Assignment, Binary, Expression], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 27, + line: 4, + col: 1, + }, + }, + targets: [ + { '@type': "uast:Identifier", + '@role': [Left], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 27, + line: 4, + col: 1, + }, + end: { '@type': "uast:Position", + offset: 30, + line: 4, + col: 4, + }, + }, + Name: "mod", + }, + ], + value: { '@type': "Call", + '@role': [Call, Expression, Function, Right], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 33, + line: 4, + col: 7, + }, + }, + args: [ + { '@type': "uast:Identifier", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 40, + line: 4, + col: 14, + }, + end: { '@type': "uast:Position", + offset: 48, + line: 4, + col: 22, + }, + }, + Name: "__name__", + }, + { '@type': "uast:String", + '@role': [Argument, Call, Function, Name, Positional], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 50, + line: 4, + col: 24, + }, + end: { '@type': "uast:Position", + offset: 55, + line: 4, + col: 29, + }, + }, + Format: "", + Value: "foo", + }, + ], + func: { '@type': "uast:Identifier", + '@role': [Call, Callee], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 33, + line: 4, + col: 7, + }, + end: { '@type': "uast:Position", + offset: 39, + line: 4, + col: 13, + }, + }, + Name: "Module", + }, + keywords: [ + { '@type': "keyword", + '@role': [Argument, Call, Function, Name], + '@pos': { '@type': "uast:Positions", + }, + '@token': { '@type': "uast:Identifier", + Name: "subdomain", + }, + value: { '@type': "uast:String", + '@role': [Argument, Value], + '@pos': { '@type': "uast:Positions", + start: { '@type': "uast:Position", + offset: 67, + line: 4, + col: 41, + }, + end: { '@type': "uast:Position", + offset: 72, + line: 4, + col: 46, + }, + }, + Format: "", + Value: "foo", + }, + }, + ], + }, + }, + ], +} \ No newline at end of file From b08b00f766588ca50c7ee4f7fd741b083aedfee7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojciech=20Jab=C5=82o=C5=84ski?= Date: Wed, 12 Dec 2018 11:25:29 +0100 Subject: [PATCH 08/12] style fixes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Wojciech Jabłoński --- uast/diff/apply.go | 8 +-- uast/diff/changelist.go | 4 +- uast/diff/changelist_test.go | 36 ++++++------ uast/diff/diff.go | 56 ++++++++----------- .../{testcase_0_dst.uast => 0_dst.uast} | 0 .../{testcase_0_src.uast => 0_src.uast} | 0 .../{testcase_100_dst.uast => 100_dst.uast} | 0 .../{testcase_100_src.uast => 100_src.uast} | 0 .../{testcase_101_dst.uast => 101_dst.uast} | 0 .../{testcase_101_src.uast => 101_src.uast} | 0 .../{testcase_102_dst.uast => 102_dst.uast} | 0 .../{testcase_102_src.uast => 102_src.uast} | 0 .../{testcase_103_dst.uast => 103_dst.uast} | 0 .../{testcase_103_src.uast => 103_src.uast} | 0 .../{testcase_104_dst.uast => 104_dst.uast} | 0 .../{testcase_104_src.uast => 104_src.uast} | 0 .../{testcase_105_dst.uast => 105_dst.uast} | 0 .../{testcase_105_src.uast => 105_src.uast} | 0 .../{testcase_106_dst.uast => 106_dst.uast} | 0 .../{testcase_106_src.uast => 106_src.uast} | 0 .../{testcase_107_dst.uast => 107_dst.uast} | 0 .../{testcase_107_src.uast => 107_src.uast} | 0 .../{testcase_108_dst.uast => 108_dst.uast} | 0 .../{testcase_108_src.uast => 108_src.uast} | 0 .../{testcase_109_dst.uast => 109_dst.uast} | 0 .../{testcase_109_src.uast => 109_src.uast} | 0 .../{testcase_10_dst.uast => 10_dst.uast} | 0 .../{testcase_10_src.uast => 10_src.uast} | 0 .../{testcase_110_dst.uast => 110_dst.uast} | 0 .../{testcase_110_src.uast => 110_src.uast} | 0 .../{testcase_111_dst.uast => 111_dst.uast} | 0 .../{testcase_111_src.uast => 111_src.uast} | 0 .../{testcase_112_dst.uast => 112_dst.uast} | 0 .../{testcase_112_src.uast => 112_src.uast} | 0 .../{testcase_113_dst.uast => 113_dst.uast} | 0 .../{testcase_113_src.uast => 113_src.uast} | 0 .../{testcase_114_dst.uast => 114_dst.uast} | 0 .../{testcase_114_src.uast => 114_src.uast} | 0 .../{testcase_115_dst.uast => 115_dst.uast} | 0 .../{testcase_115_src.uast => 115_src.uast} | 0 .../{testcase_116_dst.uast => 116_dst.uast} | 0 .../{testcase_116_src.uast => 116_src.uast} | 0 .../{testcase_117_dst.uast => 117_dst.uast} | 0 .../{testcase_117_src.uast => 117_src.uast} | 0 .../{testcase_118_dst.uast => 118_dst.uast} | 0 .../{testcase_118_src.uast => 118_src.uast} | 0 .../{testcase_119_dst.uast => 119_dst.uast} | 0 .../{testcase_119_src.uast => 119_src.uast} | 0 .../{testcase_11_dst.uast => 11_dst.uast} | 0 .../{testcase_11_src.uast => 11_src.uast} | 0 .../{testcase_120_dst.uast => 120_dst.uast} | 0 .../{testcase_120_src.uast => 120_src.uast} | 0 .../{testcase_121_dst.uast => 121_dst.uast} | 0 .../{testcase_121_src.uast => 121_src.uast} | 0 .../{testcase_122_dst.uast => 122_dst.uast} | 0 .../{testcase_122_src.uast => 122_src.uast} | 0 .../{testcase_123_dst.uast => 123_dst.uast} | 0 .../{testcase_123_src.uast => 123_src.uast} | 0 .../{testcase_124_dst.uast => 124_dst.uast} | 0 .../{testcase_124_src.uast => 124_src.uast} | 0 .../{testcase_125_dst.uast => 125_dst.uast} | 0 .../{testcase_125_src.uast => 125_src.uast} | 0 .../{testcase_126_dst.uast => 126_dst.uast} | 0 .../{testcase_126_src.uast => 126_src.uast} | 0 .../{testcase_127_dst.uast => 127_dst.uast} | 0 .../{testcase_127_src.uast => 127_src.uast} | 0 .../{testcase_128_dst.uast => 128_dst.uast} | 0 .../{testcase_128_src.uast => 128_src.uast} | 0 .../{testcase_129_dst.uast => 129_dst.uast} | 0 .../{testcase_129_src.uast => 129_src.uast} | 0 .../{testcase_12_dst.uast => 12_dst.uast} | 0 .../{testcase_12_src.uast => 12_src.uast} | 0 .../{testcase_130_dst.uast => 130_dst.uast} | 0 .../{testcase_130_src.uast => 130_src.uast} | 0 .../{testcase_131_dst.uast => 131_dst.uast} | 0 .../{testcase_131_src.uast => 131_src.uast} | 0 .../{testcase_132_dst.uast => 132_dst.uast} | 0 .../{testcase_132_src.uast => 132_src.uast} | 0 .../{testcase_133_dst.uast => 133_dst.uast} | 0 .../{testcase_133_src.uast => 133_src.uast} | 0 .../{testcase_134_dst.uast => 134_dst.uast} | 0 .../{testcase_134_src.uast => 134_src.uast} | 0 .../{testcase_135_dst.uast => 135_dst.uast} | 0 .../{testcase_135_src.uast => 135_src.uast} | 0 .../{testcase_136_dst.uast => 136_dst.uast} | 0 .../{testcase_136_src.uast => 136_src.uast} | 0 .../{testcase_137_dst.uast => 137_dst.uast} | 0 .../{testcase_137_src.uast => 137_src.uast} | 0 .../{testcase_138_dst.uast => 138_dst.uast} | 0 .../{testcase_138_src.uast => 138_src.uast} | 0 .../{testcase_139_dst.uast => 139_dst.uast} | 0 .../{testcase_139_src.uast => 139_src.uast} | 0 .../{testcase_13_dst.uast => 13_dst.uast} | 0 .../{testcase_13_src.uast => 13_src.uast} | 0 .../{testcase_140_dst.uast => 140_dst.uast} | 0 .../{testcase_140_src.uast => 140_src.uast} | 0 .../{testcase_141_dst.uast => 141_dst.uast} | 0 .../{testcase_141_src.uast => 141_src.uast} | 0 .../{testcase_142_dst.uast => 142_dst.uast} | 0 .../{testcase_142_src.uast => 142_src.uast} | 0 .../{testcase_143_dst.uast => 143_dst.uast} | 0 .../{testcase_143_src.uast => 143_src.uast} | 0 .../{testcase_144_dst.uast => 144_dst.uast} | 0 .../{testcase_144_src.uast => 144_src.uast} | 0 .../{testcase_145_dst.uast => 145_dst.uast} | 0 .../{testcase_145_src.uast => 145_src.uast} | 0 .../{testcase_146_dst.uast => 146_dst.uast} | 0 .../{testcase_146_src.uast => 146_src.uast} | 0 .../{testcase_147_dst.uast => 147_dst.uast} | 0 .../{testcase_147_src.uast => 147_src.uast} | 0 .../{testcase_14_dst.uast => 14_dst.uast} | 0 .../{testcase_14_src.uast => 14_src.uast} | 0 .../{testcase_15_dst.uast => 15_dst.uast} | 0 .../{testcase_15_src.uast => 15_src.uast} | 0 .../{testcase_16_dst.uast => 16_dst.uast} | 0 .../{testcase_16_src.uast => 16_src.uast} | 0 .../{testcase_17_dst.uast => 17_dst.uast} | 0 .../{testcase_17_src.uast => 17_src.uast} | 0 .../{testcase_18_dst.uast => 18_dst.uast} | 0 .../{testcase_18_src.uast => 18_src.uast} | 0 .../{testcase_19_dst.uast => 19_dst.uast} | 0 .../{testcase_19_src.uast => 19_src.uast} | 0 .../{testcase_1_dst.uast => 1_dst.uast} | 0 .../{testcase_1_src.uast => 1_src.uast} | 0 .../{testcase_20_dst.uast => 20_dst.uast} | 0 .../{testcase_20_src.uast => 20_src.uast} | 0 .../{testcase_21_dst.uast => 21_dst.uast} | 0 .../{testcase_21_src.uast => 21_src.uast} | 0 .../{testcase_22_dst.uast => 22_dst.uast} | 0 .../{testcase_22_src.uast => 22_src.uast} | 0 .../{testcase_23_dst.uast => 23_dst.uast} | 0 .../{testcase_23_src.uast => 23_src.uast} | 0 .../{testcase_24_dst.uast => 24_dst.uast} | 0 .../{testcase_24_src.uast => 24_src.uast} | 0 .../{testcase_25_dst.uast => 25_dst.uast} | 0 .../{testcase_25_src.uast => 25_src.uast} | 0 .../{testcase_26_dst.uast => 26_dst.uast} | 0 .../{testcase_26_src.uast => 26_src.uast} | 0 .../{testcase_27_dst.uast => 27_dst.uast} | 0 .../{testcase_27_src.uast => 27_src.uast} | 0 .../{testcase_28_dst.uast => 28_dst.uast} | 0 .../{testcase_28_src.uast => 28_src.uast} | 0 .../{testcase_29_dst.uast => 29_dst.uast} | 0 .../{testcase_29_src.uast => 29_src.uast} | 0 .../{testcase_2_dst.uast => 2_dst.uast} | 0 .../{testcase_2_src.uast => 2_src.uast} | 0 .../{testcase_30_dst.uast => 30_dst.uast} | 0 .../{testcase_30_src.uast => 30_src.uast} | 0 .../{testcase_31_dst.uast => 31_dst.uast} | 0 .../{testcase_31_src.uast => 31_src.uast} | 0 .../{testcase_32_dst.uast => 32_dst.uast} | 0 .../{testcase_32_src.uast => 32_src.uast} | 0 .../{testcase_33_dst.uast => 33_dst.uast} | 0 .../{testcase_33_src.uast => 33_src.uast} | 0 .../{testcase_34_dst.uast => 34_dst.uast} | 0 .../{testcase_34_src.uast => 34_src.uast} | 0 .../{testcase_35_dst.uast => 35_dst.uast} | 0 .../{testcase_35_src.uast => 35_src.uast} | 0 .../{testcase_36_dst.uast => 36_dst.uast} | 0 .../{testcase_36_src.uast => 36_src.uast} | 0 .../{testcase_37_dst.uast => 37_dst.uast} | 0 .../{testcase_37_src.uast => 37_src.uast} | 0 .../{testcase_38_dst.uast => 38_dst.uast} | 0 .../{testcase_38_src.uast => 38_src.uast} | 0 .../{testcase_39_dst.uast => 39_dst.uast} | 0 .../{testcase_39_src.uast => 39_src.uast} | 0 .../{testcase_3_dst.uast => 3_dst.uast} | 0 .../{testcase_3_src.uast => 3_src.uast} | 0 .../{testcase_40_dst.uast => 40_dst.uast} | 0 .../{testcase_40_src.uast => 40_src.uast} | 0 .../{testcase_41_dst.uast => 41_dst.uast} | 0 .../{testcase_41_src.uast => 41_src.uast} | 0 .../{testcase_42_dst.uast => 42_dst.uast} | 0 .../{testcase_42_src.uast => 42_src.uast} | 0 .../{testcase_43_dst.uast => 43_dst.uast} | 0 .../{testcase_43_src.uast => 43_src.uast} | 0 .../{testcase_44_dst.uast => 44_dst.uast} | 0 .../{testcase_44_src.uast => 44_src.uast} | 0 .../{testcase_45_dst.uast => 45_dst.uast} | 0 .../{testcase_45_src.uast => 45_src.uast} | 0 .../{testcase_46_dst.uast => 46_dst.uast} | 0 .../{testcase_46_src.uast => 46_src.uast} | 0 .../{testcase_47_dst.uast => 47_dst.uast} | 0 .../{testcase_47_src.uast => 47_src.uast} | 0 .../{testcase_48_dst.uast => 48_dst.uast} | 0 .../{testcase_48_src.uast => 48_src.uast} | 0 .../{testcase_49_dst.uast => 49_dst.uast} | 0 .../{testcase_49_src.uast => 49_src.uast} | 0 .../{testcase_4_dst.uast => 4_dst.uast} | 0 .../{testcase_4_src.uast => 4_src.uast} | 0 .../{testcase_50_dst.uast => 50_dst.uast} | 0 .../{testcase_50_src.uast => 50_src.uast} | 0 .../{testcase_51_dst.uast => 51_dst.uast} | 0 .../{testcase_51_src.uast => 51_src.uast} | 0 .../{testcase_52_dst.uast => 52_dst.uast} | 0 .../{testcase_52_src.uast => 52_src.uast} | 0 .../{testcase_53_dst.uast => 53_dst.uast} | 0 .../{testcase_53_src.uast => 53_src.uast} | 0 .../{testcase_54_dst.uast => 54_dst.uast} | 0 .../{testcase_54_src.uast => 54_src.uast} | 0 .../{testcase_55_dst.uast => 55_dst.uast} | 0 .../{testcase_55_src.uast => 55_src.uast} | 0 .../{testcase_56_dst.uast => 56_dst.uast} | 0 .../{testcase_56_src.uast => 56_src.uast} | 0 .../{testcase_57_dst.uast => 57_dst.uast} | 0 .../{testcase_57_src.uast => 57_src.uast} | 0 .../{testcase_58_dst.uast => 58_dst.uast} | 0 .../{testcase_58_src.uast => 58_src.uast} | 0 .../{testcase_59_dst.uast => 59_dst.uast} | 0 .../{testcase_59_src.uast => 59_src.uast} | 0 .../{testcase_5_dst.uast => 5_dst.uast} | 0 .../{testcase_5_src.uast => 5_src.uast} | 0 .../{testcase_60_dst.uast => 60_dst.uast} | 0 .../{testcase_60_src.uast => 60_src.uast} | 0 .../{testcase_61_dst.uast => 61_dst.uast} | 0 .../{testcase_61_src.uast => 61_src.uast} | 0 .../{testcase_62_dst.uast => 62_dst.uast} | 0 .../{testcase_62_src.uast => 62_src.uast} | 0 .../{testcase_63_dst.uast => 63_dst.uast} | 0 .../{testcase_63_src.uast => 63_src.uast} | 0 .../{testcase_64_dst.uast => 64_dst.uast} | 0 .../{testcase_64_src.uast => 64_src.uast} | 0 .../{testcase_65_dst.uast => 65_dst.uast} | 0 .../{testcase_65_src.uast => 65_src.uast} | 0 .../{testcase_66_dst.uast => 66_dst.uast} | 0 .../{testcase_66_src.uast => 66_src.uast} | 0 .../{testcase_67_dst.uast => 67_dst.uast} | 0 .../{testcase_67_src.uast => 67_src.uast} | 0 .../{testcase_68_dst.uast => 68_dst.uast} | 0 .../{testcase_68_src.uast => 68_src.uast} | 0 .../{testcase_69_dst.uast => 69_dst.uast} | 0 .../{testcase_69_src.uast => 69_src.uast} | 0 .../{testcase_6_dst.uast => 6_dst.uast} | 0 .../{testcase_6_src.uast => 6_src.uast} | 0 .../{testcase_70_dst.uast => 70_dst.uast} | 0 .../{testcase_70_src.uast => 70_src.uast} | 0 .../{testcase_71_dst.uast => 71_dst.uast} | 0 .../{testcase_71_src.uast => 71_src.uast} | 0 .../{testcase_72_dst.uast => 72_dst.uast} | 0 .../{testcase_72_src.uast => 72_src.uast} | 0 .../{testcase_73_dst.uast => 73_dst.uast} | 0 .../{testcase_73_src.uast => 73_src.uast} | 0 .../{testcase_74_dst.uast => 74_dst.uast} | 0 .../{testcase_74_src.uast => 74_src.uast} | 0 .../{testcase_75_dst.uast => 75_dst.uast} | 0 .../{testcase_75_src.uast => 75_src.uast} | 0 .../{testcase_76_dst.uast => 76_dst.uast} | 0 .../{testcase_76_src.uast => 76_src.uast} | 0 .../{testcase_77_dst.uast => 77_dst.uast} | 0 .../{testcase_77_src.uast => 77_src.uast} | 0 .../{testcase_78_dst.uast => 78_dst.uast} | 0 .../{testcase_78_src.uast => 78_src.uast} | 0 .../{testcase_79_dst.uast => 79_dst.uast} | 0 .../{testcase_79_src.uast => 79_src.uast} | 0 .../{testcase_7_dst.uast => 7_dst.uast} | 0 .../{testcase_7_src.uast => 7_src.uast} | 0 .../{testcase_80_dst.uast => 80_dst.uast} | 0 .../{testcase_80_src.uast => 80_src.uast} | 0 .../{testcase_81_dst.uast => 81_dst.uast} | 0 .../{testcase_81_src.uast => 81_src.uast} | 0 .../{testcase_82_dst.uast => 82_dst.uast} | 0 .../{testcase_82_src.uast => 82_src.uast} | 0 .../{testcase_83_dst.uast => 83_dst.uast} | 0 .../{testcase_83_src.uast => 83_src.uast} | 0 .../{testcase_84_dst.uast => 84_dst.uast} | 0 .../{testcase_84_src.uast => 84_src.uast} | 0 .../{testcase_85_dst.uast => 85_dst.uast} | 0 .../{testcase_85_src.uast => 85_src.uast} | 0 .../{testcase_86_dst.uast => 86_dst.uast} | 0 .../{testcase_86_src.uast => 86_src.uast} | 0 .../{testcase_87_dst.uast => 87_dst.uast} | 0 .../{testcase_87_src.uast => 87_src.uast} | 0 .../{testcase_88_dst.uast => 88_dst.uast} | 0 .../{testcase_88_src.uast => 88_src.uast} | 0 .../{testcase_89_dst.uast => 89_dst.uast} | 0 .../{testcase_89_src.uast => 89_src.uast} | 0 .../{testcase_8_dst.uast => 8_dst.uast} | 0 .../{testcase_8_src.uast => 8_src.uast} | 0 .../{testcase_90_dst.uast => 90_dst.uast} | 0 .../{testcase_90_src.uast => 90_src.uast} | 0 .../{testcase_91_dst.uast => 91_dst.uast} | 0 .../{testcase_91_src.uast => 91_src.uast} | 0 .../{testcase_92_dst.uast => 92_dst.uast} | 0 .../{testcase_92_src.uast => 92_src.uast} | 0 .../{testcase_93_dst.uast => 93_dst.uast} | 0 .../{testcase_93_src.uast => 93_src.uast} | 0 .../{testcase_94_dst.uast => 94_dst.uast} | 0 .../{testcase_94_src.uast => 94_src.uast} | 0 .../{testcase_95_dst.uast => 95_dst.uast} | 0 .../{testcase_95_src.uast => 95_src.uast} | 0 .../{testcase_96_dst.uast => 96_dst.uast} | 0 .../{testcase_96_src.uast => 96_src.uast} | 0 .../{testcase_97_dst.uast => 97_dst.uast} | 0 .../{testcase_97_src.uast => 97_src.uast} | 0 .../{testcase_98_dst.uast => 98_dst.uast} | 0 .../{testcase_98_src.uast => 98_src.uast} | 0 .../{testcase_99_dst.uast => 99_dst.uast} | 0 .../{testcase_99_src.uast => 99_src.uast} | 0 .../{testcase_9_dst.uast => 9_dst.uast} | 0 .../{testcase_9_src.uast => 9_src.uast} | 0 uast/diff/testdata/config.txt | 1 - uast/diff/testdata/create_testdata.py | 9 +-- 302 files changed, 52 insertions(+), 62 deletions(-) rename uast/diff/testdata/{testcase_0_dst.uast => 0_dst.uast} (100%) rename uast/diff/testdata/{testcase_0_src.uast => 0_src.uast} (100%) rename uast/diff/testdata/{testcase_100_dst.uast => 100_dst.uast} (100%) rename uast/diff/testdata/{testcase_100_src.uast => 100_src.uast} (100%) rename uast/diff/testdata/{testcase_101_dst.uast => 101_dst.uast} (100%) rename uast/diff/testdata/{testcase_101_src.uast => 101_src.uast} (100%) rename uast/diff/testdata/{testcase_102_dst.uast => 102_dst.uast} (100%) rename uast/diff/testdata/{testcase_102_src.uast => 102_src.uast} (100%) rename uast/diff/testdata/{testcase_103_dst.uast => 103_dst.uast} (100%) rename uast/diff/testdata/{testcase_103_src.uast => 103_src.uast} (100%) rename uast/diff/testdata/{testcase_104_dst.uast => 104_dst.uast} (100%) rename uast/diff/testdata/{testcase_104_src.uast => 104_src.uast} (100%) rename uast/diff/testdata/{testcase_105_dst.uast => 105_dst.uast} (100%) rename uast/diff/testdata/{testcase_105_src.uast => 105_src.uast} (100%) rename uast/diff/testdata/{testcase_106_dst.uast => 106_dst.uast} (100%) rename uast/diff/testdata/{testcase_106_src.uast => 106_src.uast} (100%) rename uast/diff/testdata/{testcase_107_dst.uast => 107_dst.uast} (100%) rename uast/diff/testdata/{testcase_107_src.uast => 107_src.uast} (100%) rename uast/diff/testdata/{testcase_108_dst.uast => 108_dst.uast} (100%) rename uast/diff/testdata/{testcase_108_src.uast => 108_src.uast} (100%) rename uast/diff/testdata/{testcase_109_dst.uast => 109_dst.uast} (100%) rename uast/diff/testdata/{testcase_109_src.uast => 109_src.uast} (100%) rename uast/diff/testdata/{testcase_10_dst.uast => 10_dst.uast} (100%) rename uast/diff/testdata/{testcase_10_src.uast => 10_src.uast} (100%) rename uast/diff/testdata/{testcase_110_dst.uast => 110_dst.uast} (100%) rename uast/diff/testdata/{testcase_110_src.uast => 110_src.uast} (100%) rename uast/diff/testdata/{testcase_111_dst.uast => 111_dst.uast} (100%) rename uast/diff/testdata/{testcase_111_src.uast => 111_src.uast} (100%) rename uast/diff/testdata/{testcase_112_dst.uast => 112_dst.uast} (100%) rename uast/diff/testdata/{testcase_112_src.uast => 112_src.uast} (100%) rename uast/diff/testdata/{testcase_113_dst.uast => 113_dst.uast} (100%) rename uast/diff/testdata/{testcase_113_src.uast => 113_src.uast} (100%) rename uast/diff/testdata/{testcase_114_dst.uast => 114_dst.uast} (100%) rename uast/diff/testdata/{testcase_114_src.uast => 114_src.uast} (100%) rename uast/diff/testdata/{testcase_115_dst.uast => 115_dst.uast} (100%) rename uast/diff/testdata/{testcase_115_src.uast => 115_src.uast} (100%) rename uast/diff/testdata/{testcase_116_dst.uast => 116_dst.uast} (100%) rename uast/diff/testdata/{testcase_116_src.uast => 116_src.uast} (100%) rename uast/diff/testdata/{testcase_117_dst.uast => 117_dst.uast} (100%) rename uast/diff/testdata/{testcase_117_src.uast => 117_src.uast} (100%) rename uast/diff/testdata/{testcase_118_dst.uast => 118_dst.uast} (100%) rename uast/diff/testdata/{testcase_118_src.uast => 118_src.uast} (100%) rename uast/diff/testdata/{testcase_119_dst.uast => 119_dst.uast} (100%) rename uast/diff/testdata/{testcase_119_src.uast => 119_src.uast} (100%) rename uast/diff/testdata/{testcase_11_dst.uast => 11_dst.uast} (100%) rename uast/diff/testdata/{testcase_11_src.uast => 11_src.uast} (100%) rename uast/diff/testdata/{testcase_120_dst.uast => 120_dst.uast} (100%) rename uast/diff/testdata/{testcase_120_src.uast => 120_src.uast} (100%) rename uast/diff/testdata/{testcase_121_dst.uast => 121_dst.uast} (100%) rename uast/diff/testdata/{testcase_121_src.uast => 121_src.uast} (100%) rename uast/diff/testdata/{testcase_122_dst.uast => 122_dst.uast} (100%) rename uast/diff/testdata/{testcase_122_src.uast => 122_src.uast} (100%) rename uast/diff/testdata/{testcase_123_dst.uast => 123_dst.uast} (100%) rename uast/diff/testdata/{testcase_123_src.uast => 123_src.uast} (100%) rename uast/diff/testdata/{testcase_124_dst.uast => 124_dst.uast} (100%) rename uast/diff/testdata/{testcase_124_src.uast => 124_src.uast} (100%) rename uast/diff/testdata/{testcase_125_dst.uast => 125_dst.uast} (100%) rename uast/diff/testdata/{testcase_125_src.uast => 125_src.uast} (100%) rename uast/diff/testdata/{testcase_126_dst.uast => 126_dst.uast} (100%) rename uast/diff/testdata/{testcase_126_src.uast => 126_src.uast} (100%) rename uast/diff/testdata/{testcase_127_dst.uast => 127_dst.uast} (100%) rename uast/diff/testdata/{testcase_127_src.uast => 127_src.uast} (100%) rename uast/diff/testdata/{testcase_128_dst.uast => 128_dst.uast} (100%) rename uast/diff/testdata/{testcase_128_src.uast => 128_src.uast} (100%) rename uast/diff/testdata/{testcase_129_dst.uast => 129_dst.uast} (100%) rename uast/diff/testdata/{testcase_129_src.uast => 129_src.uast} (100%) rename uast/diff/testdata/{testcase_12_dst.uast => 12_dst.uast} (100%) rename uast/diff/testdata/{testcase_12_src.uast => 12_src.uast} (100%) rename uast/diff/testdata/{testcase_130_dst.uast => 130_dst.uast} (100%) rename uast/diff/testdata/{testcase_130_src.uast => 130_src.uast} (100%) rename uast/diff/testdata/{testcase_131_dst.uast => 131_dst.uast} (100%) rename uast/diff/testdata/{testcase_131_src.uast => 131_src.uast} (100%) rename uast/diff/testdata/{testcase_132_dst.uast => 132_dst.uast} (100%) rename uast/diff/testdata/{testcase_132_src.uast => 132_src.uast} (100%) rename uast/diff/testdata/{testcase_133_dst.uast => 133_dst.uast} (100%) rename uast/diff/testdata/{testcase_133_src.uast => 133_src.uast} (100%) rename uast/diff/testdata/{testcase_134_dst.uast => 134_dst.uast} (100%) rename uast/diff/testdata/{testcase_134_src.uast => 134_src.uast} (100%) rename uast/diff/testdata/{testcase_135_dst.uast => 135_dst.uast} (100%) rename uast/diff/testdata/{testcase_135_src.uast => 135_src.uast} (100%) rename uast/diff/testdata/{testcase_136_dst.uast => 136_dst.uast} (100%) rename uast/diff/testdata/{testcase_136_src.uast => 136_src.uast} (100%) rename uast/diff/testdata/{testcase_137_dst.uast => 137_dst.uast} (100%) rename uast/diff/testdata/{testcase_137_src.uast => 137_src.uast} (100%) rename uast/diff/testdata/{testcase_138_dst.uast => 138_dst.uast} (100%) rename uast/diff/testdata/{testcase_138_src.uast => 138_src.uast} (100%) rename uast/diff/testdata/{testcase_139_dst.uast => 139_dst.uast} (100%) rename uast/diff/testdata/{testcase_139_src.uast => 139_src.uast} (100%) rename uast/diff/testdata/{testcase_13_dst.uast => 13_dst.uast} (100%) rename uast/diff/testdata/{testcase_13_src.uast => 13_src.uast} (100%) rename uast/diff/testdata/{testcase_140_dst.uast => 140_dst.uast} (100%) rename uast/diff/testdata/{testcase_140_src.uast => 140_src.uast} (100%) rename uast/diff/testdata/{testcase_141_dst.uast => 141_dst.uast} (100%) rename uast/diff/testdata/{testcase_141_src.uast => 141_src.uast} (100%) rename uast/diff/testdata/{testcase_142_dst.uast => 142_dst.uast} (100%) rename uast/diff/testdata/{testcase_142_src.uast => 142_src.uast} (100%) rename uast/diff/testdata/{testcase_143_dst.uast => 143_dst.uast} (100%) rename uast/diff/testdata/{testcase_143_src.uast => 143_src.uast} (100%) rename uast/diff/testdata/{testcase_144_dst.uast => 144_dst.uast} (100%) rename uast/diff/testdata/{testcase_144_src.uast => 144_src.uast} (100%) rename uast/diff/testdata/{testcase_145_dst.uast => 145_dst.uast} (100%) rename uast/diff/testdata/{testcase_145_src.uast => 145_src.uast} (100%) rename uast/diff/testdata/{testcase_146_dst.uast => 146_dst.uast} (100%) rename uast/diff/testdata/{testcase_146_src.uast => 146_src.uast} (100%) rename uast/diff/testdata/{testcase_147_dst.uast => 147_dst.uast} (100%) rename uast/diff/testdata/{testcase_147_src.uast => 147_src.uast} (100%) rename uast/diff/testdata/{testcase_14_dst.uast => 14_dst.uast} (100%) rename uast/diff/testdata/{testcase_14_src.uast => 14_src.uast} (100%) rename uast/diff/testdata/{testcase_15_dst.uast => 15_dst.uast} (100%) rename uast/diff/testdata/{testcase_15_src.uast => 15_src.uast} (100%) rename uast/diff/testdata/{testcase_16_dst.uast => 16_dst.uast} (100%) rename uast/diff/testdata/{testcase_16_src.uast => 16_src.uast} (100%) rename uast/diff/testdata/{testcase_17_dst.uast => 17_dst.uast} (100%) rename uast/diff/testdata/{testcase_17_src.uast => 17_src.uast} (100%) rename uast/diff/testdata/{testcase_18_dst.uast => 18_dst.uast} (100%) rename uast/diff/testdata/{testcase_18_src.uast => 18_src.uast} (100%) rename uast/diff/testdata/{testcase_19_dst.uast => 19_dst.uast} (100%) rename uast/diff/testdata/{testcase_19_src.uast => 19_src.uast} (100%) rename uast/diff/testdata/{testcase_1_dst.uast => 1_dst.uast} (100%) rename uast/diff/testdata/{testcase_1_src.uast => 1_src.uast} (100%) rename uast/diff/testdata/{testcase_20_dst.uast => 20_dst.uast} (100%) rename uast/diff/testdata/{testcase_20_src.uast => 20_src.uast} (100%) rename uast/diff/testdata/{testcase_21_dst.uast => 21_dst.uast} (100%) rename uast/diff/testdata/{testcase_21_src.uast => 21_src.uast} (100%) rename uast/diff/testdata/{testcase_22_dst.uast => 22_dst.uast} (100%) rename uast/diff/testdata/{testcase_22_src.uast => 22_src.uast} (100%) rename uast/diff/testdata/{testcase_23_dst.uast => 23_dst.uast} (100%) rename uast/diff/testdata/{testcase_23_src.uast => 23_src.uast} (100%) rename uast/diff/testdata/{testcase_24_dst.uast => 24_dst.uast} (100%) rename uast/diff/testdata/{testcase_24_src.uast => 24_src.uast} (100%) rename uast/diff/testdata/{testcase_25_dst.uast => 25_dst.uast} (100%) rename uast/diff/testdata/{testcase_25_src.uast => 25_src.uast} (100%) rename uast/diff/testdata/{testcase_26_dst.uast => 26_dst.uast} (100%) rename uast/diff/testdata/{testcase_26_src.uast => 26_src.uast} (100%) rename uast/diff/testdata/{testcase_27_dst.uast => 27_dst.uast} (100%) rename uast/diff/testdata/{testcase_27_src.uast => 27_src.uast} (100%) rename uast/diff/testdata/{testcase_28_dst.uast => 28_dst.uast} (100%) rename uast/diff/testdata/{testcase_28_src.uast => 28_src.uast} (100%) rename uast/diff/testdata/{testcase_29_dst.uast => 29_dst.uast} (100%) rename uast/diff/testdata/{testcase_29_src.uast => 29_src.uast} (100%) rename uast/diff/testdata/{testcase_2_dst.uast => 2_dst.uast} (100%) rename uast/diff/testdata/{testcase_2_src.uast => 2_src.uast} (100%) rename uast/diff/testdata/{testcase_30_dst.uast => 30_dst.uast} (100%) rename uast/diff/testdata/{testcase_30_src.uast => 30_src.uast} (100%) rename uast/diff/testdata/{testcase_31_dst.uast => 31_dst.uast} (100%) rename uast/diff/testdata/{testcase_31_src.uast => 31_src.uast} (100%) rename uast/diff/testdata/{testcase_32_dst.uast => 32_dst.uast} (100%) rename uast/diff/testdata/{testcase_32_src.uast => 32_src.uast} (100%) rename uast/diff/testdata/{testcase_33_dst.uast => 33_dst.uast} (100%) rename uast/diff/testdata/{testcase_33_src.uast => 33_src.uast} (100%) rename uast/diff/testdata/{testcase_34_dst.uast => 34_dst.uast} (100%) rename uast/diff/testdata/{testcase_34_src.uast => 34_src.uast} (100%) rename uast/diff/testdata/{testcase_35_dst.uast => 35_dst.uast} (100%) rename uast/diff/testdata/{testcase_35_src.uast => 35_src.uast} (100%) rename uast/diff/testdata/{testcase_36_dst.uast => 36_dst.uast} (100%) rename uast/diff/testdata/{testcase_36_src.uast => 36_src.uast} (100%) rename uast/diff/testdata/{testcase_37_dst.uast => 37_dst.uast} (100%) rename uast/diff/testdata/{testcase_37_src.uast => 37_src.uast} (100%) rename uast/diff/testdata/{testcase_38_dst.uast => 38_dst.uast} (100%) rename uast/diff/testdata/{testcase_38_src.uast => 38_src.uast} (100%) rename uast/diff/testdata/{testcase_39_dst.uast => 39_dst.uast} (100%) rename uast/diff/testdata/{testcase_39_src.uast => 39_src.uast} (100%) rename uast/diff/testdata/{testcase_3_dst.uast => 3_dst.uast} (100%) rename uast/diff/testdata/{testcase_3_src.uast => 3_src.uast} (100%) rename uast/diff/testdata/{testcase_40_dst.uast => 40_dst.uast} (100%) rename uast/diff/testdata/{testcase_40_src.uast => 40_src.uast} (100%) rename uast/diff/testdata/{testcase_41_dst.uast => 41_dst.uast} (100%) rename uast/diff/testdata/{testcase_41_src.uast => 41_src.uast} (100%) rename uast/diff/testdata/{testcase_42_dst.uast => 42_dst.uast} (100%) rename uast/diff/testdata/{testcase_42_src.uast => 42_src.uast} (100%) rename uast/diff/testdata/{testcase_43_dst.uast => 43_dst.uast} (100%) rename uast/diff/testdata/{testcase_43_src.uast => 43_src.uast} (100%) rename uast/diff/testdata/{testcase_44_dst.uast => 44_dst.uast} (100%) rename uast/diff/testdata/{testcase_44_src.uast => 44_src.uast} (100%) rename uast/diff/testdata/{testcase_45_dst.uast => 45_dst.uast} (100%) rename uast/diff/testdata/{testcase_45_src.uast => 45_src.uast} (100%) rename uast/diff/testdata/{testcase_46_dst.uast => 46_dst.uast} (100%) rename uast/diff/testdata/{testcase_46_src.uast => 46_src.uast} (100%) rename uast/diff/testdata/{testcase_47_dst.uast => 47_dst.uast} (100%) rename uast/diff/testdata/{testcase_47_src.uast => 47_src.uast} (100%) rename uast/diff/testdata/{testcase_48_dst.uast => 48_dst.uast} (100%) rename uast/diff/testdata/{testcase_48_src.uast => 48_src.uast} (100%) rename uast/diff/testdata/{testcase_49_dst.uast => 49_dst.uast} (100%) rename uast/diff/testdata/{testcase_49_src.uast => 49_src.uast} (100%) rename uast/diff/testdata/{testcase_4_dst.uast => 4_dst.uast} (100%) rename uast/diff/testdata/{testcase_4_src.uast => 4_src.uast} (100%) rename uast/diff/testdata/{testcase_50_dst.uast => 50_dst.uast} (100%) rename uast/diff/testdata/{testcase_50_src.uast => 50_src.uast} (100%) rename uast/diff/testdata/{testcase_51_dst.uast => 51_dst.uast} (100%) rename uast/diff/testdata/{testcase_51_src.uast => 51_src.uast} (100%) rename uast/diff/testdata/{testcase_52_dst.uast => 52_dst.uast} (100%) rename uast/diff/testdata/{testcase_52_src.uast => 52_src.uast} (100%) rename uast/diff/testdata/{testcase_53_dst.uast => 53_dst.uast} (100%) rename uast/diff/testdata/{testcase_53_src.uast => 53_src.uast} (100%) rename uast/diff/testdata/{testcase_54_dst.uast => 54_dst.uast} (100%) rename uast/diff/testdata/{testcase_54_src.uast => 54_src.uast} (100%) rename uast/diff/testdata/{testcase_55_dst.uast => 55_dst.uast} (100%) rename uast/diff/testdata/{testcase_55_src.uast => 55_src.uast} (100%) rename uast/diff/testdata/{testcase_56_dst.uast => 56_dst.uast} (100%) rename uast/diff/testdata/{testcase_56_src.uast => 56_src.uast} (100%) rename uast/diff/testdata/{testcase_57_dst.uast => 57_dst.uast} (100%) rename uast/diff/testdata/{testcase_57_src.uast => 57_src.uast} (100%) rename uast/diff/testdata/{testcase_58_dst.uast => 58_dst.uast} (100%) rename uast/diff/testdata/{testcase_58_src.uast => 58_src.uast} (100%) rename uast/diff/testdata/{testcase_59_dst.uast => 59_dst.uast} (100%) rename uast/diff/testdata/{testcase_59_src.uast => 59_src.uast} (100%) rename uast/diff/testdata/{testcase_5_dst.uast => 5_dst.uast} (100%) rename uast/diff/testdata/{testcase_5_src.uast => 5_src.uast} (100%) rename uast/diff/testdata/{testcase_60_dst.uast => 60_dst.uast} (100%) rename uast/diff/testdata/{testcase_60_src.uast => 60_src.uast} (100%) rename uast/diff/testdata/{testcase_61_dst.uast => 61_dst.uast} (100%) rename uast/diff/testdata/{testcase_61_src.uast => 61_src.uast} (100%) rename uast/diff/testdata/{testcase_62_dst.uast => 62_dst.uast} (100%) rename uast/diff/testdata/{testcase_62_src.uast => 62_src.uast} (100%) rename uast/diff/testdata/{testcase_63_dst.uast => 63_dst.uast} (100%) rename uast/diff/testdata/{testcase_63_src.uast => 63_src.uast} (100%) rename uast/diff/testdata/{testcase_64_dst.uast => 64_dst.uast} (100%) rename uast/diff/testdata/{testcase_64_src.uast => 64_src.uast} (100%) rename uast/diff/testdata/{testcase_65_dst.uast => 65_dst.uast} (100%) rename uast/diff/testdata/{testcase_65_src.uast => 65_src.uast} (100%) rename uast/diff/testdata/{testcase_66_dst.uast => 66_dst.uast} (100%) rename uast/diff/testdata/{testcase_66_src.uast => 66_src.uast} (100%) rename uast/diff/testdata/{testcase_67_dst.uast => 67_dst.uast} (100%) rename uast/diff/testdata/{testcase_67_src.uast => 67_src.uast} (100%) rename uast/diff/testdata/{testcase_68_dst.uast => 68_dst.uast} (100%) rename uast/diff/testdata/{testcase_68_src.uast => 68_src.uast} (100%) rename uast/diff/testdata/{testcase_69_dst.uast => 69_dst.uast} (100%) rename uast/diff/testdata/{testcase_69_src.uast => 69_src.uast} (100%) rename uast/diff/testdata/{testcase_6_dst.uast => 6_dst.uast} (100%) rename uast/diff/testdata/{testcase_6_src.uast => 6_src.uast} (100%) rename uast/diff/testdata/{testcase_70_dst.uast => 70_dst.uast} (100%) rename uast/diff/testdata/{testcase_70_src.uast => 70_src.uast} (100%) rename uast/diff/testdata/{testcase_71_dst.uast => 71_dst.uast} (100%) rename uast/diff/testdata/{testcase_71_src.uast => 71_src.uast} (100%) rename uast/diff/testdata/{testcase_72_dst.uast => 72_dst.uast} (100%) rename uast/diff/testdata/{testcase_72_src.uast => 72_src.uast} (100%) rename uast/diff/testdata/{testcase_73_dst.uast => 73_dst.uast} (100%) rename uast/diff/testdata/{testcase_73_src.uast => 73_src.uast} (100%) rename uast/diff/testdata/{testcase_74_dst.uast => 74_dst.uast} (100%) rename uast/diff/testdata/{testcase_74_src.uast => 74_src.uast} (100%) rename uast/diff/testdata/{testcase_75_dst.uast => 75_dst.uast} (100%) rename uast/diff/testdata/{testcase_75_src.uast => 75_src.uast} (100%) rename uast/diff/testdata/{testcase_76_dst.uast => 76_dst.uast} (100%) rename uast/diff/testdata/{testcase_76_src.uast => 76_src.uast} (100%) rename uast/diff/testdata/{testcase_77_dst.uast => 77_dst.uast} (100%) rename uast/diff/testdata/{testcase_77_src.uast => 77_src.uast} (100%) rename uast/diff/testdata/{testcase_78_dst.uast => 78_dst.uast} (100%) rename uast/diff/testdata/{testcase_78_src.uast => 78_src.uast} (100%) rename uast/diff/testdata/{testcase_79_dst.uast => 79_dst.uast} (100%) rename uast/diff/testdata/{testcase_79_src.uast => 79_src.uast} (100%) rename uast/diff/testdata/{testcase_7_dst.uast => 7_dst.uast} (100%) rename uast/diff/testdata/{testcase_7_src.uast => 7_src.uast} (100%) rename uast/diff/testdata/{testcase_80_dst.uast => 80_dst.uast} (100%) rename uast/diff/testdata/{testcase_80_src.uast => 80_src.uast} (100%) rename uast/diff/testdata/{testcase_81_dst.uast => 81_dst.uast} (100%) rename uast/diff/testdata/{testcase_81_src.uast => 81_src.uast} (100%) rename uast/diff/testdata/{testcase_82_dst.uast => 82_dst.uast} (100%) rename uast/diff/testdata/{testcase_82_src.uast => 82_src.uast} (100%) rename uast/diff/testdata/{testcase_83_dst.uast => 83_dst.uast} (100%) rename uast/diff/testdata/{testcase_83_src.uast => 83_src.uast} (100%) rename uast/diff/testdata/{testcase_84_dst.uast => 84_dst.uast} (100%) rename uast/diff/testdata/{testcase_84_src.uast => 84_src.uast} (100%) rename uast/diff/testdata/{testcase_85_dst.uast => 85_dst.uast} (100%) rename uast/diff/testdata/{testcase_85_src.uast => 85_src.uast} (100%) rename uast/diff/testdata/{testcase_86_dst.uast => 86_dst.uast} (100%) rename uast/diff/testdata/{testcase_86_src.uast => 86_src.uast} (100%) rename uast/diff/testdata/{testcase_87_dst.uast => 87_dst.uast} (100%) rename uast/diff/testdata/{testcase_87_src.uast => 87_src.uast} (100%) rename uast/diff/testdata/{testcase_88_dst.uast => 88_dst.uast} (100%) rename uast/diff/testdata/{testcase_88_src.uast => 88_src.uast} (100%) rename uast/diff/testdata/{testcase_89_dst.uast => 89_dst.uast} (100%) rename uast/diff/testdata/{testcase_89_src.uast => 89_src.uast} (100%) rename uast/diff/testdata/{testcase_8_dst.uast => 8_dst.uast} (100%) rename uast/diff/testdata/{testcase_8_src.uast => 8_src.uast} (100%) rename uast/diff/testdata/{testcase_90_dst.uast => 90_dst.uast} (100%) rename uast/diff/testdata/{testcase_90_src.uast => 90_src.uast} (100%) rename uast/diff/testdata/{testcase_91_dst.uast => 91_dst.uast} (100%) rename uast/diff/testdata/{testcase_91_src.uast => 91_src.uast} (100%) rename uast/diff/testdata/{testcase_92_dst.uast => 92_dst.uast} (100%) rename uast/diff/testdata/{testcase_92_src.uast => 92_src.uast} (100%) rename uast/diff/testdata/{testcase_93_dst.uast => 93_dst.uast} (100%) rename uast/diff/testdata/{testcase_93_src.uast => 93_src.uast} (100%) rename uast/diff/testdata/{testcase_94_dst.uast => 94_dst.uast} (100%) rename uast/diff/testdata/{testcase_94_src.uast => 94_src.uast} (100%) rename uast/diff/testdata/{testcase_95_dst.uast => 95_dst.uast} (100%) rename uast/diff/testdata/{testcase_95_src.uast => 95_src.uast} (100%) rename uast/diff/testdata/{testcase_96_dst.uast => 96_dst.uast} (100%) rename uast/diff/testdata/{testcase_96_src.uast => 96_src.uast} (100%) rename uast/diff/testdata/{testcase_97_dst.uast => 97_dst.uast} (100%) rename uast/diff/testdata/{testcase_97_src.uast => 97_src.uast} (100%) rename uast/diff/testdata/{testcase_98_dst.uast => 98_dst.uast} (100%) rename uast/diff/testdata/{testcase_98_src.uast => 98_src.uast} (100%) rename uast/diff/testdata/{testcase_99_dst.uast => 99_dst.uast} (100%) rename uast/diff/testdata/{testcase_99_src.uast => 99_src.uast} (100%) rename uast/diff/testdata/{testcase_9_dst.uast => 9_dst.uast} (100%) rename uast/diff/testdata/{testcase_9_src.uast => 9_src.uast} (100%) delete mode 100644 uast/diff/testdata/config.txt diff --git a/uast/diff/apply.go b/uast/diff/apply.go index e7e54507..39f5a078 100644 --- a/uast/diff/apply.go +++ b/uast/diff/apply.go @@ -5,7 +5,7 @@ import ( "gopkg.in/bblfsh/sdk.v2/uast/nodes" ) -func Apply(root nodes.Node, changelist Changelist) nodes.Node { +func (changelist Changelist) Apply(root nodes.Node) nodes.Node { nodeDict := make(map[ID]nodes.Node) nodes.WalkPreOrder(root, func(node nodes.Node) bool { nodeDict[nodes.UniqueKey(node)] = node @@ -15,11 +15,11 @@ func Apply(root nodes.Node, changelist Changelist) nodes.Node { for _, change := range changelist { switch ch := change.(type) { case Create: - //create a node and add to the dictionary + // create a node and add to the dictionary nodeDict[nodes.UniqueKey(ch.Node)] = ch.Node case Attach: - //get src and chld from the dictionary, attach (modify src) + // get src and chld from the dictionary, attach (modify src) parent, ok := nodeDict[ch.Parent] if !ok { panic("invalid attachment point") @@ -44,7 +44,7 @@ func Apply(root nodes.Node, changelist Changelist) nodes.Node { } case Deatach: - //get the src from the dictionary, deatach (modify src) + // get the src from the dictionary, deatach (modify src) parent := nodeDict[ch.Parent] switch key := ch.Key.(type) { diff --git a/uast/diff/changelist.go b/uast/diff/changelist.go index 19bdd3ec..a6e83fcb 100644 --- a/uast/diff/changelist.go +++ b/uast/diff/changelist.go @@ -18,7 +18,6 @@ type changeBase struct { func (changeBase) isChange() {} func (ch changeBase) TransactionID() uint64 { return ch.txID } -// TODO: proper ID of a node somehow type ID nodes.Comparable // key in a node, string for nodes.Object and int for nodes.Array @@ -56,5 +55,6 @@ type Attach struct { type Deatach struct { changeBase Parent ID - Key Key //or string, how to do alternative? + Key Key // Currently deatach semantics are only defined for nodes.Object so the Key is + // practically always a string } diff --git a/uast/diff/changelist_test.go b/uast/diff/changelist_test.go index 6b5a9b67..cce6fe99 100644 --- a/uast/diff/changelist_test.go +++ b/uast/diff/changelist_test.go @@ -1,8 +1,9 @@ package diff import ( - "fmt" + "strings" "os" + "path/filepath" "io/ioutil" "testing" "gopkg.in/bblfsh/sdk.v2/uast/yaml" @@ -22,23 +23,26 @@ func readUAST(t testing.TB, path string) nodes.Node { } func TestChangelist(t *testing.T) { - fd, err := os.Open(fmt.Sprintf("%v/config.txt", dataDir)) + dir, err := os.Open(dataDir) require.NoError(t, err) - var n int - _, err = fmt.Fscanf(fd, "%d\n", &n) + defer dir.Close() + names, err := dir.Readdirnames(-1) require.NoError(t, err) - for i := 0; i < n; i++ { - name := fmt.Sprintf("%v/testcase_%v", dataDir, i) - t.Run(name, func(t *testing.T) { - src_name := fmt.Sprintf("%v_src.uast", name) - dst_name := fmt.Sprintf("%v_dst.uast", name) - src := readUAST(t, src_name) - dst := readUAST(t, dst_name) - - changes := Changes(src, dst) - newsrc := Apply(src, changes) - require.True(t, nodes.Equal(newsrc, dst)) - }) + for _, fname := range names { + if strings.HasSuffix(fname, "_src.uast") { + name := fname[:len(fname)-len("_src.uast")] + + t.Run(name, func(t *testing.T) { + src_name := filepath.Join(dataDir, name + "_src.uast") + dst_name := filepath.Join(dataDir, name + "_dst.uast") + src := readUAST(t, src_name) + dst := readUAST(t, dst_name) + + changes := Changes(src, dst) + newsrc := changes.Apply(src) + require.True(t, nodes.Equal(newsrc, dst)) + }) + } } } diff --git a/uast/diff/diff.go b/uast/diff/diff.go index 6743641b..bdebbfb1 100644 --- a/uast/diff/diff.go +++ b/uast/diff/diff.go @@ -25,7 +25,7 @@ type permuteDecision struct { permutation []int } -//min is a convinience method for choosing the cheapest decision +// min is a convinience method for choosing the cheapest decision func min(self, candidate decisionType) decisionType { if self.cost() > candidate.cost() { return candidate @@ -34,10 +34,10 @@ func min(self, candidate decisionType) decisionType { } } -//type for cache +// type for cache type keyType struct{ k1, k2 ID } -//cache for diff computation +// cache for diff computation type cacheStorage struct { decisions map[keyType]decisionType counts map[ID]int @@ -104,16 +104,12 @@ func (ds *cacheStorage) decideAction(src, dst nodes.Node) decisionType { // the code below iterates over each of the keys from src and dst exactly once, that's why // keys isn't reset between iterations. keys := make(map[string]bool) - iterate := func(keyset nodes.Object) { - for key := range keyset { - if in := keys[key]; !in { - keys[key] = true - cost += ds.decideAction(src[key], dst[key]).cost() - } + for _, key := range append(src.Keys(), dst.Keys()...) { + if in := keys[key]; !in { + keys[key] = true + cost += ds.decideAction(src[key], dst[key]).cost() } } - iterate(src) - iterate(dst) if cost == 0 { bestDecision = min(bestDecision, sameDecision{basicDecision{cost}}) @@ -133,9 +129,7 @@ func (ds *cacheStorage) decideAction(src, dst nodes.Node) decisionType { bestDecision = min(bestDecision, sameDecision{basicDecision{cost}}) break } - } - - if len(src) != len(dst) { + } else { cost = 2 } @@ -223,28 +217,24 @@ func (ds *cacheStorage) generateDifference(src, dst nodes.Node, parentID ID, par case matchDecision: src, dst := src.(nodes.Object), dst.(nodes.Object) keys := make(map[string]bool) - iterate := func(keyset nodes.Object) { - for key := range keyset { - if in := keys[key]; !in { - keys[key] = true - if _, ok := dst[key]; !ok { - ds.push(Deatach{Parent: nodes.UniqueKey(src), Key: String(key)}) - } else if _, ok := src[key]; !ok { - ds.createRec(dst[key]) - ds.push(Attach{ - Parent: nodes.UniqueKey(src), - Key: String(key), - Child: nodes.UniqueKey(dst[key]), - }) - } else { - ds.generateDifference( - src[key], dst[key], nodes.UniqueKey(src), String(key)) - } + for _, key := range append(src.Keys(), dst.Keys()...) { + if in := keys[key]; !in { + keys[key] = true + if _, ok := dst[key]; !ok { + ds.push(Deatach{Parent: nodes.UniqueKey(src), Key: String(key)}) + } else if _, ok := src[key]; !ok { + ds.createRec(dst[key]) + ds.push(Attach{ + Parent: nodes.UniqueKey(src), + Key: String(key), + Child: nodes.UniqueKey(dst[key]), + }) + } else { + ds.generateDifference( + src[key], dst[key], nodes.UniqueKey(src), String(key)) } } } - iterate(src) - iterate(dst) case permuteDecision: src, dst := src.(nodes.Array), dst.(nodes.Array) diff --git a/uast/diff/testdata/testcase_0_dst.uast b/uast/diff/testdata/0_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_0_dst.uast rename to uast/diff/testdata/0_dst.uast diff --git a/uast/diff/testdata/testcase_0_src.uast b/uast/diff/testdata/0_src.uast similarity index 100% rename from uast/diff/testdata/testcase_0_src.uast rename to uast/diff/testdata/0_src.uast diff --git a/uast/diff/testdata/testcase_100_dst.uast b/uast/diff/testdata/100_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_100_dst.uast rename to uast/diff/testdata/100_dst.uast diff --git a/uast/diff/testdata/testcase_100_src.uast b/uast/diff/testdata/100_src.uast similarity index 100% rename from uast/diff/testdata/testcase_100_src.uast rename to uast/diff/testdata/100_src.uast diff --git a/uast/diff/testdata/testcase_101_dst.uast b/uast/diff/testdata/101_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_101_dst.uast rename to uast/diff/testdata/101_dst.uast diff --git a/uast/diff/testdata/testcase_101_src.uast b/uast/diff/testdata/101_src.uast similarity index 100% rename from uast/diff/testdata/testcase_101_src.uast rename to uast/diff/testdata/101_src.uast diff --git a/uast/diff/testdata/testcase_102_dst.uast b/uast/diff/testdata/102_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_102_dst.uast rename to uast/diff/testdata/102_dst.uast diff --git a/uast/diff/testdata/testcase_102_src.uast b/uast/diff/testdata/102_src.uast similarity index 100% rename from uast/diff/testdata/testcase_102_src.uast rename to uast/diff/testdata/102_src.uast diff --git a/uast/diff/testdata/testcase_103_dst.uast b/uast/diff/testdata/103_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_103_dst.uast rename to uast/diff/testdata/103_dst.uast diff --git a/uast/diff/testdata/testcase_103_src.uast b/uast/diff/testdata/103_src.uast similarity index 100% rename from uast/diff/testdata/testcase_103_src.uast rename to uast/diff/testdata/103_src.uast diff --git a/uast/diff/testdata/testcase_104_dst.uast b/uast/diff/testdata/104_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_104_dst.uast rename to uast/diff/testdata/104_dst.uast diff --git a/uast/diff/testdata/testcase_104_src.uast b/uast/diff/testdata/104_src.uast similarity index 100% rename from uast/diff/testdata/testcase_104_src.uast rename to uast/diff/testdata/104_src.uast diff --git a/uast/diff/testdata/testcase_105_dst.uast b/uast/diff/testdata/105_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_105_dst.uast rename to uast/diff/testdata/105_dst.uast diff --git a/uast/diff/testdata/testcase_105_src.uast b/uast/diff/testdata/105_src.uast similarity index 100% rename from uast/diff/testdata/testcase_105_src.uast rename to uast/diff/testdata/105_src.uast diff --git a/uast/diff/testdata/testcase_106_dst.uast b/uast/diff/testdata/106_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_106_dst.uast rename to uast/diff/testdata/106_dst.uast diff --git a/uast/diff/testdata/testcase_106_src.uast b/uast/diff/testdata/106_src.uast similarity index 100% rename from uast/diff/testdata/testcase_106_src.uast rename to uast/diff/testdata/106_src.uast diff --git a/uast/diff/testdata/testcase_107_dst.uast b/uast/diff/testdata/107_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_107_dst.uast rename to uast/diff/testdata/107_dst.uast diff --git a/uast/diff/testdata/testcase_107_src.uast b/uast/diff/testdata/107_src.uast similarity index 100% rename from uast/diff/testdata/testcase_107_src.uast rename to uast/diff/testdata/107_src.uast diff --git a/uast/diff/testdata/testcase_108_dst.uast b/uast/diff/testdata/108_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_108_dst.uast rename to uast/diff/testdata/108_dst.uast diff --git a/uast/diff/testdata/testcase_108_src.uast b/uast/diff/testdata/108_src.uast similarity index 100% rename from uast/diff/testdata/testcase_108_src.uast rename to uast/diff/testdata/108_src.uast diff --git a/uast/diff/testdata/testcase_109_dst.uast b/uast/diff/testdata/109_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_109_dst.uast rename to uast/diff/testdata/109_dst.uast diff --git a/uast/diff/testdata/testcase_109_src.uast b/uast/diff/testdata/109_src.uast similarity index 100% rename from uast/diff/testdata/testcase_109_src.uast rename to uast/diff/testdata/109_src.uast diff --git a/uast/diff/testdata/testcase_10_dst.uast b/uast/diff/testdata/10_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_10_dst.uast rename to uast/diff/testdata/10_dst.uast diff --git a/uast/diff/testdata/testcase_10_src.uast b/uast/diff/testdata/10_src.uast similarity index 100% rename from uast/diff/testdata/testcase_10_src.uast rename to uast/diff/testdata/10_src.uast diff --git a/uast/diff/testdata/testcase_110_dst.uast b/uast/diff/testdata/110_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_110_dst.uast rename to uast/diff/testdata/110_dst.uast diff --git a/uast/diff/testdata/testcase_110_src.uast b/uast/diff/testdata/110_src.uast similarity index 100% rename from uast/diff/testdata/testcase_110_src.uast rename to uast/diff/testdata/110_src.uast diff --git a/uast/diff/testdata/testcase_111_dst.uast b/uast/diff/testdata/111_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_111_dst.uast rename to uast/diff/testdata/111_dst.uast diff --git a/uast/diff/testdata/testcase_111_src.uast b/uast/diff/testdata/111_src.uast similarity index 100% rename from uast/diff/testdata/testcase_111_src.uast rename to uast/diff/testdata/111_src.uast diff --git a/uast/diff/testdata/testcase_112_dst.uast b/uast/diff/testdata/112_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_112_dst.uast rename to uast/diff/testdata/112_dst.uast diff --git a/uast/diff/testdata/testcase_112_src.uast b/uast/diff/testdata/112_src.uast similarity index 100% rename from uast/diff/testdata/testcase_112_src.uast rename to uast/diff/testdata/112_src.uast diff --git a/uast/diff/testdata/testcase_113_dst.uast b/uast/diff/testdata/113_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_113_dst.uast rename to uast/diff/testdata/113_dst.uast diff --git a/uast/diff/testdata/testcase_113_src.uast b/uast/diff/testdata/113_src.uast similarity index 100% rename from uast/diff/testdata/testcase_113_src.uast rename to uast/diff/testdata/113_src.uast diff --git a/uast/diff/testdata/testcase_114_dst.uast b/uast/diff/testdata/114_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_114_dst.uast rename to uast/diff/testdata/114_dst.uast diff --git a/uast/diff/testdata/testcase_114_src.uast b/uast/diff/testdata/114_src.uast similarity index 100% rename from uast/diff/testdata/testcase_114_src.uast rename to uast/diff/testdata/114_src.uast diff --git a/uast/diff/testdata/testcase_115_dst.uast b/uast/diff/testdata/115_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_115_dst.uast rename to uast/diff/testdata/115_dst.uast diff --git a/uast/diff/testdata/testcase_115_src.uast b/uast/diff/testdata/115_src.uast similarity index 100% rename from uast/diff/testdata/testcase_115_src.uast rename to uast/diff/testdata/115_src.uast diff --git a/uast/diff/testdata/testcase_116_dst.uast b/uast/diff/testdata/116_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_116_dst.uast rename to uast/diff/testdata/116_dst.uast diff --git a/uast/diff/testdata/testcase_116_src.uast b/uast/diff/testdata/116_src.uast similarity index 100% rename from uast/diff/testdata/testcase_116_src.uast rename to uast/diff/testdata/116_src.uast diff --git a/uast/diff/testdata/testcase_117_dst.uast b/uast/diff/testdata/117_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_117_dst.uast rename to uast/diff/testdata/117_dst.uast diff --git a/uast/diff/testdata/testcase_117_src.uast b/uast/diff/testdata/117_src.uast similarity index 100% rename from uast/diff/testdata/testcase_117_src.uast rename to uast/diff/testdata/117_src.uast diff --git a/uast/diff/testdata/testcase_118_dst.uast b/uast/diff/testdata/118_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_118_dst.uast rename to uast/diff/testdata/118_dst.uast diff --git a/uast/diff/testdata/testcase_118_src.uast b/uast/diff/testdata/118_src.uast similarity index 100% rename from uast/diff/testdata/testcase_118_src.uast rename to uast/diff/testdata/118_src.uast diff --git a/uast/diff/testdata/testcase_119_dst.uast b/uast/diff/testdata/119_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_119_dst.uast rename to uast/diff/testdata/119_dst.uast diff --git a/uast/diff/testdata/testcase_119_src.uast b/uast/diff/testdata/119_src.uast similarity index 100% rename from uast/diff/testdata/testcase_119_src.uast rename to uast/diff/testdata/119_src.uast diff --git a/uast/diff/testdata/testcase_11_dst.uast b/uast/diff/testdata/11_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_11_dst.uast rename to uast/diff/testdata/11_dst.uast diff --git a/uast/diff/testdata/testcase_11_src.uast b/uast/diff/testdata/11_src.uast similarity index 100% rename from uast/diff/testdata/testcase_11_src.uast rename to uast/diff/testdata/11_src.uast diff --git a/uast/diff/testdata/testcase_120_dst.uast b/uast/diff/testdata/120_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_120_dst.uast rename to uast/diff/testdata/120_dst.uast diff --git a/uast/diff/testdata/testcase_120_src.uast b/uast/diff/testdata/120_src.uast similarity index 100% rename from uast/diff/testdata/testcase_120_src.uast rename to uast/diff/testdata/120_src.uast diff --git a/uast/diff/testdata/testcase_121_dst.uast b/uast/diff/testdata/121_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_121_dst.uast rename to uast/diff/testdata/121_dst.uast diff --git a/uast/diff/testdata/testcase_121_src.uast b/uast/diff/testdata/121_src.uast similarity index 100% rename from uast/diff/testdata/testcase_121_src.uast rename to uast/diff/testdata/121_src.uast diff --git a/uast/diff/testdata/testcase_122_dst.uast b/uast/diff/testdata/122_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_122_dst.uast rename to uast/diff/testdata/122_dst.uast diff --git a/uast/diff/testdata/testcase_122_src.uast b/uast/diff/testdata/122_src.uast similarity index 100% rename from uast/diff/testdata/testcase_122_src.uast rename to uast/diff/testdata/122_src.uast diff --git a/uast/diff/testdata/testcase_123_dst.uast b/uast/diff/testdata/123_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_123_dst.uast rename to uast/diff/testdata/123_dst.uast diff --git a/uast/diff/testdata/testcase_123_src.uast b/uast/diff/testdata/123_src.uast similarity index 100% rename from uast/diff/testdata/testcase_123_src.uast rename to uast/diff/testdata/123_src.uast diff --git a/uast/diff/testdata/testcase_124_dst.uast b/uast/diff/testdata/124_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_124_dst.uast rename to uast/diff/testdata/124_dst.uast diff --git a/uast/diff/testdata/testcase_124_src.uast b/uast/diff/testdata/124_src.uast similarity index 100% rename from uast/diff/testdata/testcase_124_src.uast rename to uast/diff/testdata/124_src.uast diff --git a/uast/diff/testdata/testcase_125_dst.uast b/uast/diff/testdata/125_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_125_dst.uast rename to uast/diff/testdata/125_dst.uast diff --git a/uast/diff/testdata/testcase_125_src.uast b/uast/diff/testdata/125_src.uast similarity index 100% rename from uast/diff/testdata/testcase_125_src.uast rename to uast/diff/testdata/125_src.uast diff --git a/uast/diff/testdata/testcase_126_dst.uast b/uast/diff/testdata/126_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_126_dst.uast rename to uast/diff/testdata/126_dst.uast diff --git a/uast/diff/testdata/testcase_126_src.uast b/uast/diff/testdata/126_src.uast similarity index 100% rename from uast/diff/testdata/testcase_126_src.uast rename to uast/diff/testdata/126_src.uast diff --git a/uast/diff/testdata/testcase_127_dst.uast b/uast/diff/testdata/127_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_127_dst.uast rename to uast/diff/testdata/127_dst.uast diff --git a/uast/diff/testdata/testcase_127_src.uast b/uast/diff/testdata/127_src.uast similarity index 100% rename from uast/diff/testdata/testcase_127_src.uast rename to uast/diff/testdata/127_src.uast diff --git a/uast/diff/testdata/testcase_128_dst.uast b/uast/diff/testdata/128_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_128_dst.uast rename to uast/diff/testdata/128_dst.uast diff --git a/uast/diff/testdata/testcase_128_src.uast b/uast/diff/testdata/128_src.uast similarity index 100% rename from uast/diff/testdata/testcase_128_src.uast rename to uast/diff/testdata/128_src.uast diff --git a/uast/diff/testdata/testcase_129_dst.uast b/uast/diff/testdata/129_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_129_dst.uast rename to uast/diff/testdata/129_dst.uast diff --git a/uast/diff/testdata/testcase_129_src.uast b/uast/diff/testdata/129_src.uast similarity index 100% rename from uast/diff/testdata/testcase_129_src.uast rename to uast/diff/testdata/129_src.uast diff --git a/uast/diff/testdata/testcase_12_dst.uast b/uast/diff/testdata/12_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_12_dst.uast rename to uast/diff/testdata/12_dst.uast diff --git a/uast/diff/testdata/testcase_12_src.uast b/uast/diff/testdata/12_src.uast similarity index 100% rename from uast/diff/testdata/testcase_12_src.uast rename to uast/diff/testdata/12_src.uast diff --git a/uast/diff/testdata/testcase_130_dst.uast b/uast/diff/testdata/130_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_130_dst.uast rename to uast/diff/testdata/130_dst.uast diff --git a/uast/diff/testdata/testcase_130_src.uast b/uast/diff/testdata/130_src.uast similarity index 100% rename from uast/diff/testdata/testcase_130_src.uast rename to uast/diff/testdata/130_src.uast diff --git a/uast/diff/testdata/testcase_131_dst.uast b/uast/diff/testdata/131_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_131_dst.uast rename to uast/diff/testdata/131_dst.uast diff --git a/uast/diff/testdata/testcase_131_src.uast b/uast/diff/testdata/131_src.uast similarity index 100% rename from uast/diff/testdata/testcase_131_src.uast rename to uast/diff/testdata/131_src.uast diff --git a/uast/diff/testdata/testcase_132_dst.uast b/uast/diff/testdata/132_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_132_dst.uast rename to uast/diff/testdata/132_dst.uast diff --git a/uast/diff/testdata/testcase_132_src.uast b/uast/diff/testdata/132_src.uast similarity index 100% rename from uast/diff/testdata/testcase_132_src.uast rename to uast/diff/testdata/132_src.uast diff --git a/uast/diff/testdata/testcase_133_dst.uast b/uast/diff/testdata/133_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_133_dst.uast rename to uast/diff/testdata/133_dst.uast diff --git a/uast/diff/testdata/testcase_133_src.uast b/uast/diff/testdata/133_src.uast similarity index 100% rename from uast/diff/testdata/testcase_133_src.uast rename to uast/diff/testdata/133_src.uast diff --git a/uast/diff/testdata/testcase_134_dst.uast b/uast/diff/testdata/134_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_134_dst.uast rename to uast/diff/testdata/134_dst.uast diff --git a/uast/diff/testdata/testcase_134_src.uast b/uast/diff/testdata/134_src.uast similarity index 100% rename from uast/diff/testdata/testcase_134_src.uast rename to uast/diff/testdata/134_src.uast diff --git a/uast/diff/testdata/testcase_135_dst.uast b/uast/diff/testdata/135_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_135_dst.uast rename to uast/diff/testdata/135_dst.uast diff --git a/uast/diff/testdata/testcase_135_src.uast b/uast/diff/testdata/135_src.uast similarity index 100% rename from uast/diff/testdata/testcase_135_src.uast rename to uast/diff/testdata/135_src.uast diff --git a/uast/diff/testdata/testcase_136_dst.uast b/uast/diff/testdata/136_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_136_dst.uast rename to uast/diff/testdata/136_dst.uast diff --git a/uast/diff/testdata/testcase_136_src.uast b/uast/diff/testdata/136_src.uast similarity index 100% rename from uast/diff/testdata/testcase_136_src.uast rename to uast/diff/testdata/136_src.uast diff --git a/uast/diff/testdata/testcase_137_dst.uast b/uast/diff/testdata/137_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_137_dst.uast rename to uast/diff/testdata/137_dst.uast diff --git a/uast/diff/testdata/testcase_137_src.uast b/uast/diff/testdata/137_src.uast similarity index 100% rename from uast/diff/testdata/testcase_137_src.uast rename to uast/diff/testdata/137_src.uast diff --git a/uast/diff/testdata/testcase_138_dst.uast b/uast/diff/testdata/138_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_138_dst.uast rename to uast/diff/testdata/138_dst.uast diff --git a/uast/diff/testdata/testcase_138_src.uast b/uast/diff/testdata/138_src.uast similarity index 100% rename from uast/diff/testdata/testcase_138_src.uast rename to uast/diff/testdata/138_src.uast diff --git a/uast/diff/testdata/testcase_139_dst.uast b/uast/diff/testdata/139_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_139_dst.uast rename to uast/diff/testdata/139_dst.uast diff --git a/uast/diff/testdata/testcase_139_src.uast b/uast/diff/testdata/139_src.uast similarity index 100% rename from uast/diff/testdata/testcase_139_src.uast rename to uast/diff/testdata/139_src.uast diff --git a/uast/diff/testdata/testcase_13_dst.uast b/uast/diff/testdata/13_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_13_dst.uast rename to uast/diff/testdata/13_dst.uast diff --git a/uast/diff/testdata/testcase_13_src.uast b/uast/diff/testdata/13_src.uast similarity index 100% rename from uast/diff/testdata/testcase_13_src.uast rename to uast/diff/testdata/13_src.uast diff --git a/uast/diff/testdata/testcase_140_dst.uast b/uast/diff/testdata/140_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_140_dst.uast rename to uast/diff/testdata/140_dst.uast diff --git a/uast/diff/testdata/testcase_140_src.uast b/uast/diff/testdata/140_src.uast similarity index 100% rename from uast/diff/testdata/testcase_140_src.uast rename to uast/diff/testdata/140_src.uast diff --git a/uast/diff/testdata/testcase_141_dst.uast b/uast/diff/testdata/141_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_141_dst.uast rename to uast/diff/testdata/141_dst.uast diff --git a/uast/diff/testdata/testcase_141_src.uast b/uast/diff/testdata/141_src.uast similarity index 100% rename from uast/diff/testdata/testcase_141_src.uast rename to uast/diff/testdata/141_src.uast diff --git a/uast/diff/testdata/testcase_142_dst.uast b/uast/diff/testdata/142_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_142_dst.uast rename to uast/diff/testdata/142_dst.uast diff --git a/uast/diff/testdata/testcase_142_src.uast b/uast/diff/testdata/142_src.uast similarity index 100% rename from uast/diff/testdata/testcase_142_src.uast rename to uast/diff/testdata/142_src.uast diff --git a/uast/diff/testdata/testcase_143_dst.uast b/uast/diff/testdata/143_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_143_dst.uast rename to uast/diff/testdata/143_dst.uast diff --git a/uast/diff/testdata/testcase_143_src.uast b/uast/diff/testdata/143_src.uast similarity index 100% rename from uast/diff/testdata/testcase_143_src.uast rename to uast/diff/testdata/143_src.uast diff --git a/uast/diff/testdata/testcase_144_dst.uast b/uast/diff/testdata/144_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_144_dst.uast rename to uast/diff/testdata/144_dst.uast diff --git a/uast/diff/testdata/testcase_144_src.uast b/uast/diff/testdata/144_src.uast similarity index 100% rename from uast/diff/testdata/testcase_144_src.uast rename to uast/diff/testdata/144_src.uast diff --git a/uast/diff/testdata/testcase_145_dst.uast b/uast/diff/testdata/145_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_145_dst.uast rename to uast/diff/testdata/145_dst.uast diff --git a/uast/diff/testdata/testcase_145_src.uast b/uast/diff/testdata/145_src.uast similarity index 100% rename from uast/diff/testdata/testcase_145_src.uast rename to uast/diff/testdata/145_src.uast diff --git a/uast/diff/testdata/testcase_146_dst.uast b/uast/diff/testdata/146_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_146_dst.uast rename to uast/diff/testdata/146_dst.uast diff --git a/uast/diff/testdata/testcase_146_src.uast b/uast/diff/testdata/146_src.uast similarity index 100% rename from uast/diff/testdata/testcase_146_src.uast rename to uast/diff/testdata/146_src.uast diff --git a/uast/diff/testdata/testcase_147_dst.uast b/uast/diff/testdata/147_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_147_dst.uast rename to uast/diff/testdata/147_dst.uast diff --git a/uast/diff/testdata/testcase_147_src.uast b/uast/diff/testdata/147_src.uast similarity index 100% rename from uast/diff/testdata/testcase_147_src.uast rename to uast/diff/testdata/147_src.uast diff --git a/uast/diff/testdata/testcase_14_dst.uast b/uast/diff/testdata/14_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_14_dst.uast rename to uast/diff/testdata/14_dst.uast diff --git a/uast/diff/testdata/testcase_14_src.uast b/uast/diff/testdata/14_src.uast similarity index 100% rename from uast/diff/testdata/testcase_14_src.uast rename to uast/diff/testdata/14_src.uast diff --git a/uast/diff/testdata/testcase_15_dst.uast b/uast/diff/testdata/15_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_15_dst.uast rename to uast/diff/testdata/15_dst.uast diff --git a/uast/diff/testdata/testcase_15_src.uast b/uast/diff/testdata/15_src.uast similarity index 100% rename from uast/diff/testdata/testcase_15_src.uast rename to uast/diff/testdata/15_src.uast diff --git a/uast/diff/testdata/testcase_16_dst.uast b/uast/diff/testdata/16_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_16_dst.uast rename to uast/diff/testdata/16_dst.uast diff --git a/uast/diff/testdata/testcase_16_src.uast b/uast/diff/testdata/16_src.uast similarity index 100% rename from uast/diff/testdata/testcase_16_src.uast rename to uast/diff/testdata/16_src.uast diff --git a/uast/diff/testdata/testcase_17_dst.uast b/uast/diff/testdata/17_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_17_dst.uast rename to uast/diff/testdata/17_dst.uast diff --git a/uast/diff/testdata/testcase_17_src.uast b/uast/diff/testdata/17_src.uast similarity index 100% rename from uast/diff/testdata/testcase_17_src.uast rename to uast/diff/testdata/17_src.uast diff --git a/uast/diff/testdata/testcase_18_dst.uast b/uast/diff/testdata/18_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_18_dst.uast rename to uast/diff/testdata/18_dst.uast diff --git a/uast/diff/testdata/testcase_18_src.uast b/uast/diff/testdata/18_src.uast similarity index 100% rename from uast/diff/testdata/testcase_18_src.uast rename to uast/diff/testdata/18_src.uast diff --git a/uast/diff/testdata/testcase_19_dst.uast b/uast/diff/testdata/19_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_19_dst.uast rename to uast/diff/testdata/19_dst.uast diff --git a/uast/diff/testdata/testcase_19_src.uast b/uast/diff/testdata/19_src.uast similarity index 100% rename from uast/diff/testdata/testcase_19_src.uast rename to uast/diff/testdata/19_src.uast diff --git a/uast/diff/testdata/testcase_1_dst.uast b/uast/diff/testdata/1_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_1_dst.uast rename to uast/diff/testdata/1_dst.uast diff --git a/uast/diff/testdata/testcase_1_src.uast b/uast/diff/testdata/1_src.uast similarity index 100% rename from uast/diff/testdata/testcase_1_src.uast rename to uast/diff/testdata/1_src.uast diff --git a/uast/diff/testdata/testcase_20_dst.uast b/uast/diff/testdata/20_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_20_dst.uast rename to uast/diff/testdata/20_dst.uast diff --git a/uast/diff/testdata/testcase_20_src.uast b/uast/diff/testdata/20_src.uast similarity index 100% rename from uast/diff/testdata/testcase_20_src.uast rename to uast/diff/testdata/20_src.uast diff --git a/uast/diff/testdata/testcase_21_dst.uast b/uast/diff/testdata/21_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_21_dst.uast rename to uast/diff/testdata/21_dst.uast diff --git a/uast/diff/testdata/testcase_21_src.uast b/uast/diff/testdata/21_src.uast similarity index 100% rename from uast/diff/testdata/testcase_21_src.uast rename to uast/diff/testdata/21_src.uast diff --git a/uast/diff/testdata/testcase_22_dst.uast b/uast/diff/testdata/22_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_22_dst.uast rename to uast/diff/testdata/22_dst.uast diff --git a/uast/diff/testdata/testcase_22_src.uast b/uast/diff/testdata/22_src.uast similarity index 100% rename from uast/diff/testdata/testcase_22_src.uast rename to uast/diff/testdata/22_src.uast diff --git a/uast/diff/testdata/testcase_23_dst.uast b/uast/diff/testdata/23_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_23_dst.uast rename to uast/diff/testdata/23_dst.uast diff --git a/uast/diff/testdata/testcase_23_src.uast b/uast/diff/testdata/23_src.uast similarity index 100% rename from uast/diff/testdata/testcase_23_src.uast rename to uast/diff/testdata/23_src.uast diff --git a/uast/diff/testdata/testcase_24_dst.uast b/uast/diff/testdata/24_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_24_dst.uast rename to uast/diff/testdata/24_dst.uast diff --git a/uast/diff/testdata/testcase_24_src.uast b/uast/diff/testdata/24_src.uast similarity index 100% rename from uast/diff/testdata/testcase_24_src.uast rename to uast/diff/testdata/24_src.uast diff --git a/uast/diff/testdata/testcase_25_dst.uast b/uast/diff/testdata/25_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_25_dst.uast rename to uast/diff/testdata/25_dst.uast diff --git a/uast/diff/testdata/testcase_25_src.uast b/uast/diff/testdata/25_src.uast similarity index 100% rename from uast/diff/testdata/testcase_25_src.uast rename to uast/diff/testdata/25_src.uast diff --git a/uast/diff/testdata/testcase_26_dst.uast b/uast/diff/testdata/26_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_26_dst.uast rename to uast/diff/testdata/26_dst.uast diff --git a/uast/diff/testdata/testcase_26_src.uast b/uast/diff/testdata/26_src.uast similarity index 100% rename from uast/diff/testdata/testcase_26_src.uast rename to uast/diff/testdata/26_src.uast diff --git a/uast/diff/testdata/testcase_27_dst.uast b/uast/diff/testdata/27_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_27_dst.uast rename to uast/diff/testdata/27_dst.uast diff --git a/uast/diff/testdata/testcase_27_src.uast b/uast/diff/testdata/27_src.uast similarity index 100% rename from uast/diff/testdata/testcase_27_src.uast rename to uast/diff/testdata/27_src.uast diff --git a/uast/diff/testdata/testcase_28_dst.uast b/uast/diff/testdata/28_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_28_dst.uast rename to uast/diff/testdata/28_dst.uast diff --git a/uast/diff/testdata/testcase_28_src.uast b/uast/diff/testdata/28_src.uast similarity index 100% rename from uast/diff/testdata/testcase_28_src.uast rename to uast/diff/testdata/28_src.uast diff --git a/uast/diff/testdata/testcase_29_dst.uast b/uast/diff/testdata/29_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_29_dst.uast rename to uast/diff/testdata/29_dst.uast diff --git a/uast/diff/testdata/testcase_29_src.uast b/uast/diff/testdata/29_src.uast similarity index 100% rename from uast/diff/testdata/testcase_29_src.uast rename to uast/diff/testdata/29_src.uast diff --git a/uast/diff/testdata/testcase_2_dst.uast b/uast/diff/testdata/2_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_2_dst.uast rename to uast/diff/testdata/2_dst.uast diff --git a/uast/diff/testdata/testcase_2_src.uast b/uast/diff/testdata/2_src.uast similarity index 100% rename from uast/diff/testdata/testcase_2_src.uast rename to uast/diff/testdata/2_src.uast diff --git a/uast/diff/testdata/testcase_30_dst.uast b/uast/diff/testdata/30_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_30_dst.uast rename to uast/diff/testdata/30_dst.uast diff --git a/uast/diff/testdata/testcase_30_src.uast b/uast/diff/testdata/30_src.uast similarity index 100% rename from uast/diff/testdata/testcase_30_src.uast rename to uast/diff/testdata/30_src.uast diff --git a/uast/diff/testdata/testcase_31_dst.uast b/uast/diff/testdata/31_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_31_dst.uast rename to uast/diff/testdata/31_dst.uast diff --git a/uast/diff/testdata/testcase_31_src.uast b/uast/diff/testdata/31_src.uast similarity index 100% rename from uast/diff/testdata/testcase_31_src.uast rename to uast/diff/testdata/31_src.uast diff --git a/uast/diff/testdata/testcase_32_dst.uast b/uast/diff/testdata/32_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_32_dst.uast rename to uast/diff/testdata/32_dst.uast diff --git a/uast/diff/testdata/testcase_32_src.uast b/uast/diff/testdata/32_src.uast similarity index 100% rename from uast/diff/testdata/testcase_32_src.uast rename to uast/diff/testdata/32_src.uast diff --git a/uast/diff/testdata/testcase_33_dst.uast b/uast/diff/testdata/33_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_33_dst.uast rename to uast/diff/testdata/33_dst.uast diff --git a/uast/diff/testdata/testcase_33_src.uast b/uast/diff/testdata/33_src.uast similarity index 100% rename from uast/diff/testdata/testcase_33_src.uast rename to uast/diff/testdata/33_src.uast diff --git a/uast/diff/testdata/testcase_34_dst.uast b/uast/diff/testdata/34_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_34_dst.uast rename to uast/diff/testdata/34_dst.uast diff --git a/uast/diff/testdata/testcase_34_src.uast b/uast/diff/testdata/34_src.uast similarity index 100% rename from uast/diff/testdata/testcase_34_src.uast rename to uast/diff/testdata/34_src.uast diff --git a/uast/diff/testdata/testcase_35_dst.uast b/uast/diff/testdata/35_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_35_dst.uast rename to uast/diff/testdata/35_dst.uast diff --git a/uast/diff/testdata/testcase_35_src.uast b/uast/diff/testdata/35_src.uast similarity index 100% rename from uast/diff/testdata/testcase_35_src.uast rename to uast/diff/testdata/35_src.uast diff --git a/uast/diff/testdata/testcase_36_dst.uast b/uast/diff/testdata/36_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_36_dst.uast rename to uast/diff/testdata/36_dst.uast diff --git a/uast/diff/testdata/testcase_36_src.uast b/uast/diff/testdata/36_src.uast similarity index 100% rename from uast/diff/testdata/testcase_36_src.uast rename to uast/diff/testdata/36_src.uast diff --git a/uast/diff/testdata/testcase_37_dst.uast b/uast/diff/testdata/37_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_37_dst.uast rename to uast/diff/testdata/37_dst.uast diff --git a/uast/diff/testdata/testcase_37_src.uast b/uast/diff/testdata/37_src.uast similarity index 100% rename from uast/diff/testdata/testcase_37_src.uast rename to uast/diff/testdata/37_src.uast diff --git a/uast/diff/testdata/testcase_38_dst.uast b/uast/diff/testdata/38_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_38_dst.uast rename to uast/diff/testdata/38_dst.uast diff --git a/uast/diff/testdata/testcase_38_src.uast b/uast/diff/testdata/38_src.uast similarity index 100% rename from uast/diff/testdata/testcase_38_src.uast rename to uast/diff/testdata/38_src.uast diff --git a/uast/diff/testdata/testcase_39_dst.uast b/uast/diff/testdata/39_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_39_dst.uast rename to uast/diff/testdata/39_dst.uast diff --git a/uast/diff/testdata/testcase_39_src.uast b/uast/diff/testdata/39_src.uast similarity index 100% rename from uast/diff/testdata/testcase_39_src.uast rename to uast/diff/testdata/39_src.uast diff --git a/uast/diff/testdata/testcase_3_dst.uast b/uast/diff/testdata/3_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_3_dst.uast rename to uast/diff/testdata/3_dst.uast diff --git a/uast/diff/testdata/testcase_3_src.uast b/uast/diff/testdata/3_src.uast similarity index 100% rename from uast/diff/testdata/testcase_3_src.uast rename to uast/diff/testdata/3_src.uast diff --git a/uast/diff/testdata/testcase_40_dst.uast b/uast/diff/testdata/40_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_40_dst.uast rename to uast/diff/testdata/40_dst.uast diff --git a/uast/diff/testdata/testcase_40_src.uast b/uast/diff/testdata/40_src.uast similarity index 100% rename from uast/diff/testdata/testcase_40_src.uast rename to uast/diff/testdata/40_src.uast diff --git a/uast/diff/testdata/testcase_41_dst.uast b/uast/diff/testdata/41_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_41_dst.uast rename to uast/diff/testdata/41_dst.uast diff --git a/uast/diff/testdata/testcase_41_src.uast b/uast/diff/testdata/41_src.uast similarity index 100% rename from uast/diff/testdata/testcase_41_src.uast rename to uast/diff/testdata/41_src.uast diff --git a/uast/diff/testdata/testcase_42_dst.uast b/uast/diff/testdata/42_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_42_dst.uast rename to uast/diff/testdata/42_dst.uast diff --git a/uast/diff/testdata/testcase_42_src.uast b/uast/diff/testdata/42_src.uast similarity index 100% rename from uast/diff/testdata/testcase_42_src.uast rename to uast/diff/testdata/42_src.uast diff --git a/uast/diff/testdata/testcase_43_dst.uast b/uast/diff/testdata/43_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_43_dst.uast rename to uast/diff/testdata/43_dst.uast diff --git a/uast/diff/testdata/testcase_43_src.uast b/uast/diff/testdata/43_src.uast similarity index 100% rename from uast/diff/testdata/testcase_43_src.uast rename to uast/diff/testdata/43_src.uast diff --git a/uast/diff/testdata/testcase_44_dst.uast b/uast/diff/testdata/44_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_44_dst.uast rename to uast/diff/testdata/44_dst.uast diff --git a/uast/diff/testdata/testcase_44_src.uast b/uast/diff/testdata/44_src.uast similarity index 100% rename from uast/diff/testdata/testcase_44_src.uast rename to uast/diff/testdata/44_src.uast diff --git a/uast/diff/testdata/testcase_45_dst.uast b/uast/diff/testdata/45_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_45_dst.uast rename to uast/diff/testdata/45_dst.uast diff --git a/uast/diff/testdata/testcase_45_src.uast b/uast/diff/testdata/45_src.uast similarity index 100% rename from uast/diff/testdata/testcase_45_src.uast rename to uast/diff/testdata/45_src.uast diff --git a/uast/diff/testdata/testcase_46_dst.uast b/uast/diff/testdata/46_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_46_dst.uast rename to uast/diff/testdata/46_dst.uast diff --git a/uast/diff/testdata/testcase_46_src.uast b/uast/diff/testdata/46_src.uast similarity index 100% rename from uast/diff/testdata/testcase_46_src.uast rename to uast/diff/testdata/46_src.uast diff --git a/uast/diff/testdata/testcase_47_dst.uast b/uast/diff/testdata/47_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_47_dst.uast rename to uast/diff/testdata/47_dst.uast diff --git a/uast/diff/testdata/testcase_47_src.uast b/uast/diff/testdata/47_src.uast similarity index 100% rename from uast/diff/testdata/testcase_47_src.uast rename to uast/diff/testdata/47_src.uast diff --git a/uast/diff/testdata/testcase_48_dst.uast b/uast/diff/testdata/48_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_48_dst.uast rename to uast/diff/testdata/48_dst.uast diff --git a/uast/diff/testdata/testcase_48_src.uast b/uast/diff/testdata/48_src.uast similarity index 100% rename from uast/diff/testdata/testcase_48_src.uast rename to uast/diff/testdata/48_src.uast diff --git a/uast/diff/testdata/testcase_49_dst.uast b/uast/diff/testdata/49_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_49_dst.uast rename to uast/diff/testdata/49_dst.uast diff --git a/uast/diff/testdata/testcase_49_src.uast b/uast/diff/testdata/49_src.uast similarity index 100% rename from uast/diff/testdata/testcase_49_src.uast rename to uast/diff/testdata/49_src.uast diff --git a/uast/diff/testdata/testcase_4_dst.uast b/uast/diff/testdata/4_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_4_dst.uast rename to uast/diff/testdata/4_dst.uast diff --git a/uast/diff/testdata/testcase_4_src.uast b/uast/diff/testdata/4_src.uast similarity index 100% rename from uast/diff/testdata/testcase_4_src.uast rename to uast/diff/testdata/4_src.uast diff --git a/uast/diff/testdata/testcase_50_dst.uast b/uast/diff/testdata/50_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_50_dst.uast rename to uast/diff/testdata/50_dst.uast diff --git a/uast/diff/testdata/testcase_50_src.uast b/uast/diff/testdata/50_src.uast similarity index 100% rename from uast/diff/testdata/testcase_50_src.uast rename to uast/diff/testdata/50_src.uast diff --git a/uast/diff/testdata/testcase_51_dst.uast b/uast/diff/testdata/51_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_51_dst.uast rename to uast/diff/testdata/51_dst.uast diff --git a/uast/diff/testdata/testcase_51_src.uast b/uast/diff/testdata/51_src.uast similarity index 100% rename from uast/diff/testdata/testcase_51_src.uast rename to uast/diff/testdata/51_src.uast diff --git a/uast/diff/testdata/testcase_52_dst.uast b/uast/diff/testdata/52_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_52_dst.uast rename to uast/diff/testdata/52_dst.uast diff --git a/uast/diff/testdata/testcase_52_src.uast b/uast/diff/testdata/52_src.uast similarity index 100% rename from uast/diff/testdata/testcase_52_src.uast rename to uast/diff/testdata/52_src.uast diff --git a/uast/diff/testdata/testcase_53_dst.uast b/uast/diff/testdata/53_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_53_dst.uast rename to uast/diff/testdata/53_dst.uast diff --git a/uast/diff/testdata/testcase_53_src.uast b/uast/diff/testdata/53_src.uast similarity index 100% rename from uast/diff/testdata/testcase_53_src.uast rename to uast/diff/testdata/53_src.uast diff --git a/uast/diff/testdata/testcase_54_dst.uast b/uast/diff/testdata/54_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_54_dst.uast rename to uast/diff/testdata/54_dst.uast diff --git a/uast/diff/testdata/testcase_54_src.uast b/uast/diff/testdata/54_src.uast similarity index 100% rename from uast/diff/testdata/testcase_54_src.uast rename to uast/diff/testdata/54_src.uast diff --git a/uast/diff/testdata/testcase_55_dst.uast b/uast/diff/testdata/55_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_55_dst.uast rename to uast/diff/testdata/55_dst.uast diff --git a/uast/diff/testdata/testcase_55_src.uast b/uast/diff/testdata/55_src.uast similarity index 100% rename from uast/diff/testdata/testcase_55_src.uast rename to uast/diff/testdata/55_src.uast diff --git a/uast/diff/testdata/testcase_56_dst.uast b/uast/diff/testdata/56_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_56_dst.uast rename to uast/diff/testdata/56_dst.uast diff --git a/uast/diff/testdata/testcase_56_src.uast b/uast/diff/testdata/56_src.uast similarity index 100% rename from uast/diff/testdata/testcase_56_src.uast rename to uast/diff/testdata/56_src.uast diff --git a/uast/diff/testdata/testcase_57_dst.uast b/uast/diff/testdata/57_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_57_dst.uast rename to uast/diff/testdata/57_dst.uast diff --git a/uast/diff/testdata/testcase_57_src.uast b/uast/diff/testdata/57_src.uast similarity index 100% rename from uast/diff/testdata/testcase_57_src.uast rename to uast/diff/testdata/57_src.uast diff --git a/uast/diff/testdata/testcase_58_dst.uast b/uast/diff/testdata/58_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_58_dst.uast rename to uast/diff/testdata/58_dst.uast diff --git a/uast/diff/testdata/testcase_58_src.uast b/uast/diff/testdata/58_src.uast similarity index 100% rename from uast/diff/testdata/testcase_58_src.uast rename to uast/diff/testdata/58_src.uast diff --git a/uast/diff/testdata/testcase_59_dst.uast b/uast/diff/testdata/59_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_59_dst.uast rename to uast/diff/testdata/59_dst.uast diff --git a/uast/diff/testdata/testcase_59_src.uast b/uast/diff/testdata/59_src.uast similarity index 100% rename from uast/diff/testdata/testcase_59_src.uast rename to uast/diff/testdata/59_src.uast diff --git a/uast/diff/testdata/testcase_5_dst.uast b/uast/diff/testdata/5_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_5_dst.uast rename to uast/diff/testdata/5_dst.uast diff --git a/uast/diff/testdata/testcase_5_src.uast b/uast/diff/testdata/5_src.uast similarity index 100% rename from uast/diff/testdata/testcase_5_src.uast rename to uast/diff/testdata/5_src.uast diff --git a/uast/diff/testdata/testcase_60_dst.uast b/uast/diff/testdata/60_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_60_dst.uast rename to uast/diff/testdata/60_dst.uast diff --git a/uast/diff/testdata/testcase_60_src.uast b/uast/diff/testdata/60_src.uast similarity index 100% rename from uast/diff/testdata/testcase_60_src.uast rename to uast/diff/testdata/60_src.uast diff --git a/uast/diff/testdata/testcase_61_dst.uast b/uast/diff/testdata/61_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_61_dst.uast rename to uast/diff/testdata/61_dst.uast diff --git a/uast/diff/testdata/testcase_61_src.uast b/uast/diff/testdata/61_src.uast similarity index 100% rename from uast/diff/testdata/testcase_61_src.uast rename to uast/diff/testdata/61_src.uast diff --git a/uast/diff/testdata/testcase_62_dst.uast b/uast/diff/testdata/62_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_62_dst.uast rename to uast/diff/testdata/62_dst.uast diff --git a/uast/diff/testdata/testcase_62_src.uast b/uast/diff/testdata/62_src.uast similarity index 100% rename from uast/diff/testdata/testcase_62_src.uast rename to uast/diff/testdata/62_src.uast diff --git a/uast/diff/testdata/testcase_63_dst.uast b/uast/diff/testdata/63_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_63_dst.uast rename to uast/diff/testdata/63_dst.uast diff --git a/uast/diff/testdata/testcase_63_src.uast b/uast/diff/testdata/63_src.uast similarity index 100% rename from uast/diff/testdata/testcase_63_src.uast rename to uast/diff/testdata/63_src.uast diff --git a/uast/diff/testdata/testcase_64_dst.uast b/uast/diff/testdata/64_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_64_dst.uast rename to uast/diff/testdata/64_dst.uast diff --git a/uast/diff/testdata/testcase_64_src.uast b/uast/diff/testdata/64_src.uast similarity index 100% rename from uast/diff/testdata/testcase_64_src.uast rename to uast/diff/testdata/64_src.uast diff --git a/uast/diff/testdata/testcase_65_dst.uast b/uast/diff/testdata/65_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_65_dst.uast rename to uast/diff/testdata/65_dst.uast diff --git a/uast/diff/testdata/testcase_65_src.uast b/uast/diff/testdata/65_src.uast similarity index 100% rename from uast/diff/testdata/testcase_65_src.uast rename to uast/diff/testdata/65_src.uast diff --git a/uast/diff/testdata/testcase_66_dst.uast b/uast/diff/testdata/66_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_66_dst.uast rename to uast/diff/testdata/66_dst.uast diff --git a/uast/diff/testdata/testcase_66_src.uast b/uast/diff/testdata/66_src.uast similarity index 100% rename from uast/diff/testdata/testcase_66_src.uast rename to uast/diff/testdata/66_src.uast diff --git a/uast/diff/testdata/testcase_67_dst.uast b/uast/diff/testdata/67_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_67_dst.uast rename to uast/diff/testdata/67_dst.uast diff --git a/uast/diff/testdata/testcase_67_src.uast b/uast/diff/testdata/67_src.uast similarity index 100% rename from uast/diff/testdata/testcase_67_src.uast rename to uast/diff/testdata/67_src.uast diff --git a/uast/diff/testdata/testcase_68_dst.uast b/uast/diff/testdata/68_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_68_dst.uast rename to uast/diff/testdata/68_dst.uast diff --git a/uast/diff/testdata/testcase_68_src.uast b/uast/diff/testdata/68_src.uast similarity index 100% rename from uast/diff/testdata/testcase_68_src.uast rename to uast/diff/testdata/68_src.uast diff --git a/uast/diff/testdata/testcase_69_dst.uast b/uast/diff/testdata/69_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_69_dst.uast rename to uast/diff/testdata/69_dst.uast diff --git a/uast/diff/testdata/testcase_69_src.uast b/uast/diff/testdata/69_src.uast similarity index 100% rename from uast/diff/testdata/testcase_69_src.uast rename to uast/diff/testdata/69_src.uast diff --git a/uast/diff/testdata/testcase_6_dst.uast b/uast/diff/testdata/6_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_6_dst.uast rename to uast/diff/testdata/6_dst.uast diff --git a/uast/diff/testdata/testcase_6_src.uast b/uast/diff/testdata/6_src.uast similarity index 100% rename from uast/diff/testdata/testcase_6_src.uast rename to uast/diff/testdata/6_src.uast diff --git a/uast/diff/testdata/testcase_70_dst.uast b/uast/diff/testdata/70_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_70_dst.uast rename to uast/diff/testdata/70_dst.uast diff --git a/uast/diff/testdata/testcase_70_src.uast b/uast/diff/testdata/70_src.uast similarity index 100% rename from uast/diff/testdata/testcase_70_src.uast rename to uast/diff/testdata/70_src.uast diff --git a/uast/diff/testdata/testcase_71_dst.uast b/uast/diff/testdata/71_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_71_dst.uast rename to uast/diff/testdata/71_dst.uast diff --git a/uast/diff/testdata/testcase_71_src.uast b/uast/diff/testdata/71_src.uast similarity index 100% rename from uast/diff/testdata/testcase_71_src.uast rename to uast/diff/testdata/71_src.uast diff --git a/uast/diff/testdata/testcase_72_dst.uast b/uast/diff/testdata/72_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_72_dst.uast rename to uast/diff/testdata/72_dst.uast diff --git a/uast/diff/testdata/testcase_72_src.uast b/uast/diff/testdata/72_src.uast similarity index 100% rename from uast/diff/testdata/testcase_72_src.uast rename to uast/diff/testdata/72_src.uast diff --git a/uast/diff/testdata/testcase_73_dst.uast b/uast/diff/testdata/73_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_73_dst.uast rename to uast/diff/testdata/73_dst.uast diff --git a/uast/diff/testdata/testcase_73_src.uast b/uast/diff/testdata/73_src.uast similarity index 100% rename from uast/diff/testdata/testcase_73_src.uast rename to uast/diff/testdata/73_src.uast diff --git a/uast/diff/testdata/testcase_74_dst.uast b/uast/diff/testdata/74_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_74_dst.uast rename to uast/diff/testdata/74_dst.uast diff --git a/uast/diff/testdata/testcase_74_src.uast b/uast/diff/testdata/74_src.uast similarity index 100% rename from uast/diff/testdata/testcase_74_src.uast rename to uast/diff/testdata/74_src.uast diff --git a/uast/diff/testdata/testcase_75_dst.uast b/uast/diff/testdata/75_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_75_dst.uast rename to uast/diff/testdata/75_dst.uast diff --git a/uast/diff/testdata/testcase_75_src.uast b/uast/diff/testdata/75_src.uast similarity index 100% rename from uast/diff/testdata/testcase_75_src.uast rename to uast/diff/testdata/75_src.uast diff --git a/uast/diff/testdata/testcase_76_dst.uast b/uast/diff/testdata/76_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_76_dst.uast rename to uast/diff/testdata/76_dst.uast diff --git a/uast/diff/testdata/testcase_76_src.uast b/uast/diff/testdata/76_src.uast similarity index 100% rename from uast/diff/testdata/testcase_76_src.uast rename to uast/diff/testdata/76_src.uast diff --git a/uast/diff/testdata/testcase_77_dst.uast b/uast/diff/testdata/77_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_77_dst.uast rename to uast/diff/testdata/77_dst.uast diff --git a/uast/diff/testdata/testcase_77_src.uast b/uast/diff/testdata/77_src.uast similarity index 100% rename from uast/diff/testdata/testcase_77_src.uast rename to uast/diff/testdata/77_src.uast diff --git a/uast/diff/testdata/testcase_78_dst.uast b/uast/diff/testdata/78_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_78_dst.uast rename to uast/diff/testdata/78_dst.uast diff --git a/uast/diff/testdata/testcase_78_src.uast b/uast/diff/testdata/78_src.uast similarity index 100% rename from uast/diff/testdata/testcase_78_src.uast rename to uast/diff/testdata/78_src.uast diff --git a/uast/diff/testdata/testcase_79_dst.uast b/uast/diff/testdata/79_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_79_dst.uast rename to uast/diff/testdata/79_dst.uast diff --git a/uast/diff/testdata/testcase_79_src.uast b/uast/diff/testdata/79_src.uast similarity index 100% rename from uast/diff/testdata/testcase_79_src.uast rename to uast/diff/testdata/79_src.uast diff --git a/uast/diff/testdata/testcase_7_dst.uast b/uast/diff/testdata/7_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_7_dst.uast rename to uast/diff/testdata/7_dst.uast diff --git a/uast/diff/testdata/testcase_7_src.uast b/uast/diff/testdata/7_src.uast similarity index 100% rename from uast/diff/testdata/testcase_7_src.uast rename to uast/diff/testdata/7_src.uast diff --git a/uast/diff/testdata/testcase_80_dst.uast b/uast/diff/testdata/80_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_80_dst.uast rename to uast/diff/testdata/80_dst.uast diff --git a/uast/diff/testdata/testcase_80_src.uast b/uast/diff/testdata/80_src.uast similarity index 100% rename from uast/diff/testdata/testcase_80_src.uast rename to uast/diff/testdata/80_src.uast diff --git a/uast/diff/testdata/testcase_81_dst.uast b/uast/diff/testdata/81_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_81_dst.uast rename to uast/diff/testdata/81_dst.uast diff --git a/uast/diff/testdata/testcase_81_src.uast b/uast/diff/testdata/81_src.uast similarity index 100% rename from uast/diff/testdata/testcase_81_src.uast rename to uast/diff/testdata/81_src.uast diff --git a/uast/diff/testdata/testcase_82_dst.uast b/uast/diff/testdata/82_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_82_dst.uast rename to uast/diff/testdata/82_dst.uast diff --git a/uast/diff/testdata/testcase_82_src.uast b/uast/diff/testdata/82_src.uast similarity index 100% rename from uast/diff/testdata/testcase_82_src.uast rename to uast/diff/testdata/82_src.uast diff --git a/uast/diff/testdata/testcase_83_dst.uast b/uast/diff/testdata/83_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_83_dst.uast rename to uast/diff/testdata/83_dst.uast diff --git a/uast/diff/testdata/testcase_83_src.uast b/uast/diff/testdata/83_src.uast similarity index 100% rename from uast/diff/testdata/testcase_83_src.uast rename to uast/diff/testdata/83_src.uast diff --git a/uast/diff/testdata/testcase_84_dst.uast b/uast/diff/testdata/84_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_84_dst.uast rename to uast/diff/testdata/84_dst.uast diff --git a/uast/diff/testdata/testcase_84_src.uast b/uast/diff/testdata/84_src.uast similarity index 100% rename from uast/diff/testdata/testcase_84_src.uast rename to uast/diff/testdata/84_src.uast diff --git a/uast/diff/testdata/testcase_85_dst.uast b/uast/diff/testdata/85_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_85_dst.uast rename to uast/diff/testdata/85_dst.uast diff --git a/uast/diff/testdata/testcase_85_src.uast b/uast/diff/testdata/85_src.uast similarity index 100% rename from uast/diff/testdata/testcase_85_src.uast rename to uast/diff/testdata/85_src.uast diff --git a/uast/diff/testdata/testcase_86_dst.uast b/uast/diff/testdata/86_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_86_dst.uast rename to uast/diff/testdata/86_dst.uast diff --git a/uast/diff/testdata/testcase_86_src.uast b/uast/diff/testdata/86_src.uast similarity index 100% rename from uast/diff/testdata/testcase_86_src.uast rename to uast/diff/testdata/86_src.uast diff --git a/uast/diff/testdata/testcase_87_dst.uast b/uast/diff/testdata/87_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_87_dst.uast rename to uast/diff/testdata/87_dst.uast diff --git a/uast/diff/testdata/testcase_87_src.uast b/uast/diff/testdata/87_src.uast similarity index 100% rename from uast/diff/testdata/testcase_87_src.uast rename to uast/diff/testdata/87_src.uast diff --git a/uast/diff/testdata/testcase_88_dst.uast b/uast/diff/testdata/88_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_88_dst.uast rename to uast/diff/testdata/88_dst.uast diff --git a/uast/diff/testdata/testcase_88_src.uast b/uast/diff/testdata/88_src.uast similarity index 100% rename from uast/diff/testdata/testcase_88_src.uast rename to uast/diff/testdata/88_src.uast diff --git a/uast/diff/testdata/testcase_89_dst.uast b/uast/diff/testdata/89_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_89_dst.uast rename to uast/diff/testdata/89_dst.uast diff --git a/uast/diff/testdata/testcase_89_src.uast b/uast/diff/testdata/89_src.uast similarity index 100% rename from uast/diff/testdata/testcase_89_src.uast rename to uast/diff/testdata/89_src.uast diff --git a/uast/diff/testdata/testcase_8_dst.uast b/uast/diff/testdata/8_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_8_dst.uast rename to uast/diff/testdata/8_dst.uast diff --git a/uast/diff/testdata/testcase_8_src.uast b/uast/diff/testdata/8_src.uast similarity index 100% rename from uast/diff/testdata/testcase_8_src.uast rename to uast/diff/testdata/8_src.uast diff --git a/uast/diff/testdata/testcase_90_dst.uast b/uast/diff/testdata/90_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_90_dst.uast rename to uast/diff/testdata/90_dst.uast diff --git a/uast/diff/testdata/testcase_90_src.uast b/uast/diff/testdata/90_src.uast similarity index 100% rename from uast/diff/testdata/testcase_90_src.uast rename to uast/diff/testdata/90_src.uast diff --git a/uast/diff/testdata/testcase_91_dst.uast b/uast/diff/testdata/91_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_91_dst.uast rename to uast/diff/testdata/91_dst.uast diff --git a/uast/diff/testdata/testcase_91_src.uast b/uast/diff/testdata/91_src.uast similarity index 100% rename from uast/diff/testdata/testcase_91_src.uast rename to uast/diff/testdata/91_src.uast diff --git a/uast/diff/testdata/testcase_92_dst.uast b/uast/diff/testdata/92_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_92_dst.uast rename to uast/diff/testdata/92_dst.uast diff --git a/uast/diff/testdata/testcase_92_src.uast b/uast/diff/testdata/92_src.uast similarity index 100% rename from uast/diff/testdata/testcase_92_src.uast rename to uast/diff/testdata/92_src.uast diff --git a/uast/diff/testdata/testcase_93_dst.uast b/uast/diff/testdata/93_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_93_dst.uast rename to uast/diff/testdata/93_dst.uast diff --git a/uast/diff/testdata/testcase_93_src.uast b/uast/diff/testdata/93_src.uast similarity index 100% rename from uast/diff/testdata/testcase_93_src.uast rename to uast/diff/testdata/93_src.uast diff --git a/uast/diff/testdata/testcase_94_dst.uast b/uast/diff/testdata/94_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_94_dst.uast rename to uast/diff/testdata/94_dst.uast diff --git a/uast/diff/testdata/testcase_94_src.uast b/uast/diff/testdata/94_src.uast similarity index 100% rename from uast/diff/testdata/testcase_94_src.uast rename to uast/diff/testdata/94_src.uast diff --git a/uast/diff/testdata/testcase_95_dst.uast b/uast/diff/testdata/95_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_95_dst.uast rename to uast/diff/testdata/95_dst.uast diff --git a/uast/diff/testdata/testcase_95_src.uast b/uast/diff/testdata/95_src.uast similarity index 100% rename from uast/diff/testdata/testcase_95_src.uast rename to uast/diff/testdata/95_src.uast diff --git a/uast/diff/testdata/testcase_96_dst.uast b/uast/diff/testdata/96_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_96_dst.uast rename to uast/diff/testdata/96_dst.uast diff --git a/uast/diff/testdata/testcase_96_src.uast b/uast/diff/testdata/96_src.uast similarity index 100% rename from uast/diff/testdata/testcase_96_src.uast rename to uast/diff/testdata/96_src.uast diff --git a/uast/diff/testdata/testcase_97_dst.uast b/uast/diff/testdata/97_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_97_dst.uast rename to uast/diff/testdata/97_dst.uast diff --git a/uast/diff/testdata/testcase_97_src.uast b/uast/diff/testdata/97_src.uast similarity index 100% rename from uast/diff/testdata/testcase_97_src.uast rename to uast/diff/testdata/97_src.uast diff --git a/uast/diff/testdata/testcase_98_dst.uast b/uast/diff/testdata/98_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_98_dst.uast rename to uast/diff/testdata/98_dst.uast diff --git a/uast/diff/testdata/testcase_98_src.uast b/uast/diff/testdata/98_src.uast similarity index 100% rename from uast/diff/testdata/testcase_98_src.uast rename to uast/diff/testdata/98_src.uast diff --git a/uast/diff/testdata/testcase_99_dst.uast b/uast/diff/testdata/99_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_99_dst.uast rename to uast/diff/testdata/99_dst.uast diff --git a/uast/diff/testdata/testcase_99_src.uast b/uast/diff/testdata/99_src.uast similarity index 100% rename from uast/diff/testdata/testcase_99_src.uast rename to uast/diff/testdata/99_src.uast diff --git a/uast/diff/testdata/testcase_9_dst.uast b/uast/diff/testdata/9_dst.uast similarity index 100% rename from uast/diff/testdata/testcase_9_dst.uast rename to uast/diff/testdata/9_dst.uast diff --git a/uast/diff/testdata/testcase_9_src.uast b/uast/diff/testdata/9_src.uast similarity index 100% rename from uast/diff/testdata/testcase_9_src.uast rename to uast/diff/testdata/9_src.uast diff --git a/uast/diff/testdata/config.txt b/uast/diff/testdata/config.txt deleted file mode 100644 index 0d667b5e..00000000 --- a/uast/diff/testdata/config.txt +++ /dev/null @@ -1 +0,0 @@ -148 diff --git a/uast/diff/testdata/create_testdata.py b/uast/diff/testdata/create_testdata.py index 89ee5f06..afc00669 100755 --- a/uast/diff/testdata/create_testdata.py +++ b/uast/diff/testdata/create_testdata.py @@ -4,7 +4,7 @@ # to get diffed acquired from # https://github.com/vmarkovtsev/treediff/blob/49356e7f85c261ed88cf46326791765c58c22b5b/dataset/flask.tar.xz # It uses https://github.com/bblfsh/client-go#Installation to convert python sources into -# uast binary files. +# uast yaml files. # It needs to be configured with proper DATASET_PATH which is a path to an unpacked # flask.tar.xz file. @@ -28,9 +28,6 @@ def get_dst(name): i = 0 for src, dst in ((get_src(name), get_dst(name)) for name in testnames): print(i, src) - os.system("bblfsh-cli -l python {} -o yaml > testcase_{}_src.uast".format(src, i)) - os.system("bblfsh-cli -l python {} -o yaml > testcase_{}_dst.uast".format(dst, i)) + os.system("bblfsh-cli -l python {} -o yaml > {}_src.uast".format(src, i)) + os.system("bblfsh-cli -l python {} -o yaml > {}_dst.uast".format(dst, i)) i += 1 - -# number of testcases -open("config.txt", "w").write("{}\n".format(i)) From f61f2da1ea4bfefadcb5ddc4b60cf59d412b15d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojciech=20Jab=C5=82o=C5=84ski?= Date: Wed, 12 Dec 2018 11:38:03 +0100 Subject: [PATCH 09/12] simplified decisionType instances MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Wojciech Jabłoński --- uast/diff/diff.go | 35 +++++++++++++++++------------------ 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/uast/diff/diff.go b/uast/diff/diff.go index bdebbfb1..14b246a8 100644 --- a/uast/diff/diff.go +++ b/uast/diff/diff.go @@ -10,21 +10,20 @@ type decisionType interface { cost() int } -type basicDecision struct { - privateCost int -} - -func (b basicDecision) cost() int { return b.privateCost } - // match decision types together with their params -type sameDecision struct{ basicDecision } -type replaceDecision struct{ basicDecision } -type matchDecision struct{ basicDecision } +type sameDecision struct{ privateCost int } +type replaceDecision struct{ privateCost int } +type matchDecision struct{ privateCost int } type permuteDecision struct { - basicDecision + privateCost int permutation []int } +func (d sameDecision) cost() int { return d.privateCost } +func (d replaceDecision) cost() int { return d.privateCost } +func (d matchDecision) cost() int { return d.privateCost } +func (d permuteDecision) cost() int { return d.privateCost } + // min is a convinience method for choosing the cheapest decision func min(self, candidate decisionType) decisionType { if self.cost() > candidate.cost() { @@ -76,7 +75,7 @@ func (ds *cacheStorage) decideAction(src, dst nodes.Node) decisionType { cost := ds.nodeSize(dst) + 1 var bestDecision decisionType - bestDecision = replaceDecision{basicDecision{cost}} + bestDecision = replaceDecision{cost} if nodes.KindOf(src) != nodes.KindOf(dst) { ds.decisions[label] = bestDecision @@ -91,10 +90,10 @@ func (ds *cacheStorage) decideAction(src, dst nodes.Node) decisionType { dst := dst.(nodes.Value) cost = 0 if src == dst { - bestDecision = min(bestDecision, sameDecision{basicDecision{cost}}) + bestDecision = min(bestDecision, sameDecision{cost}) } else { cost = 1 - bestDecision = min(bestDecision, replaceDecision{basicDecision{cost}}) + bestDecision = min(bestDecision, replaceDecision{cost}) } case nodes.Object: @@ -112,9 +111,9 @@ func (ds *cacheStorage) decideAction(src, dst nodes.Node) decisionType { } if cost == 0 { - bestDecision = min(bestDecision, sameDecision{basicDecision{cost}}) + bestDecision = min(bestDecision, sameDecision{cost}) } else { - bestDecision = min(bestDecision, matchDecision{basicDecision{cost}}) + bestDecision = min(bestDecision, matchDecision{cost}) } case nodes.Array: @@ -126,7 +125,7 @@ func (ds *cacheStorage) decideAction(src, dst nodes.Node) decisionType { sum += ds.decideAction(src[i], dst[i]).cost() } if sum == 0 { - bestDecision = min(bestDecision, sameDecision{basicDecision{cost}}) + bestDecision = min(bestDecision, sameDecision{cost}) break } } else { @@ -162,11 +161,11 @@ func (ds *cacheStorage) decideAction(src, dst nodes.Node) decisionType { cost += res.Cost - bestDecision = min(bestDecision, permuteDecision{basicDecision{cost}, res.InRow}) + bestDecision = min(bestDecision, permuteDecision{cost, res.InRow}) case nil: cost = 0 - bestDecision = min(bestDecision, sameDecision{basicDecision{cost}}) + bestDecision = min(bestDecision, sameDecision{cost}) default: panic(fmt.Errorf("unknown node type %T", src)) From eeffeb898ea689df48361592b309a4cafedb20da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojciech=20Jab=C5=82o=C5=84ski?= Date: Sun, 24 Mar 2019 16:08:02 +0100 Subject: [PATCH 10/12] style changes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Wojciech Jabłoński --- uast/diff/apply.go | 3 ++ uast/diff/changelist.go | 19 +++++++--- uast/diff/changelist_test.go | 72 ++++++++++++++++++------------------ uast/diff/diff.go | 26 +++++++------ 4 files changed, 67 insertions(+), 53 deletions(-) diff --git a/uast/diff/apply.go b/uast/diff/apply.go index 39f5a078..432faa2a 100644 --- a/uast/diff/apply.go +++ b/uast/diff/apply.go @@ -2,9 +2,12 @@ package diff import ( "fmt" + "gopkg.in/bblfsh/sdk.v2/uast/nodes" ) +// Apply is a method that takes a tree (nodes.Node) and applies the current changelist to that +// tree. func (changelist Changelist) Apply(root nodes.Node) nodes.Node { nodeDict := make(map[ID]nodes.Node) nodes.WalkPreOrder(root, func(node nodes.Node) bool { diff --git a/uast/diff/changelist.go b/uast/diff/changelist.go index a6e83fcb..fdc24760 100644 --- a/uast/diff/changelist.go +++ b/uast/diff/changelist.go @@ -4,8 +4,11 @@ import ( "gopkg.in/bblfsh/sdk.v2/uast/nodes" ) +// Changelist is a list of changes, a result of tree difference. Applying all changes from a +// changelist on a source tree will result in it being transformed into the destination tree. type Changelist []Change +// Change is a single operation performed type Change interface { isChange() TransactionID() uint64 @@ -18,12 +21,16 @@ type changeBase struct { func (changeBase) isChange() {} func (ch changeBase) TransactionID() uint64 { return ch.txID } +// ID is a type representing node unique ID that can be compared in O(1) type ID nodes.Comparable -// key in a node, string for nodes.Object and int for nodes.Array +// Key in a node, string for nodes.Object and int for nodes.Array type Key interface{ isKey() } +// String is a wrapped string type for the Key interface. type String string + +// Int is a wrapped int type for the Key interface. type Int int func (Int) isKey() {} @@ -37,13 +44,13 @@ type Create struct { Node nodes.Node } -// delete a node by ID +// Delete a node by ID type Delete struct { changeBase NodeID ID } -// attach a node as a child of another node with a given key +// Attach a node as a child of another node with a given key type Attach struct { changeBase Parent ID @@ -51,10 +58,10 @@ type Attach struct { Child ID } -// deatach a child from a node +// Deatach a child from a node type Deatach struct { changeBase Parent ID - Key Key // Currently deatach semantics are only defined for nodes.Object so the Key is - // practically always a string + Key Key // Currently deatach semantics are only defined for nodes.Object so the Key is + // practically always a string } diff --git a/uast/diff/changelist_test.go b/uast/diff/changelist_test.go index cce6fe99..18ccd006 100644 --- a/uast/diff/changelist_test.go +++ b/uast/diff/changelist_test.go @@ -1,48 +1,48 @@ package diff import ( - "strings" - "os" - "path/filepath" - "io/ioutil" - "testing" - "gopkg.in/bblfsh/sdk.v2/uast/yaml" - "gopkg.in/bblfsh/sdk.v2/uast/nodes" - "github.com/stretchr/testify/require" + "io/ioutil" + "os" + "path/filepath" + "strings" + "testing" + + "github.com/stretchr/testify/require" + "gopkg.in/bblfsh/sdk.v2/uast/nodes" + uastyml "gopkg.in/bblfsh/sdk.v2/uast/yaml" ) - const dataDir = "./testdata" func readUAST(t testing.TB, path string) nodes.Node { - data, err := ioutil.ReadFile(path) - require.NoError(t, err) - nd, err := uastyml.Unmarshal(data) - require.NoError(t, err) - return nd + data, err := ioutil.ReadFile(path) + require.NoError(t, err) + nd, err := uastyml.Unmarshal(data) + require.NoError(t, err) + return nd } func TestChangelist(t *testing.T) { - dir, err := os.Open(dataDir) - require.NoError(t, err) - defer dir.Close() - names, err := dir.Readdirnames(-1) - require.NoError(t, err) - - for _, fname := range names { - if strings.HasSuffix(fname, "_src.uast") { - name := fname[:len(fname)-len("_src.uast")] - - t.Run(name, func(t *testing.T) { - src_name := filepath.Join(dataDir, name + "_src.uast") - dst_name := filepath.Join(dataDir, name + "_dst.uast") - src := readUAST(t, src_name) - dst := readUAST(t, dst_name) - - changes := Changes(src, dst) - newsrc := changes.Apply(src) - require.True(t, nodes.Equal(newsrc, dst)) - }) - } - } + dir, err := os.Open(dataDir) + require.NoError(t, err) + defer dir.Close() + names, err := dir.Readdirnames(-1) + require.NoError(t, err) + + for _, fname := range names { + if strings.HasSuffix(fname, "_src.uast") { + name := fname[:len(fname)-len("_src.uast")] + + t.Run(name, func(t *testing.T) { + srcName := filepath.Join(dataDir, name+"_src.uast") + dstName := filepath.Join(dataDir, name+"_dst.uast") + src := readUAST(t, srcName) + dst := readUAST(t, dstName) + + changes := Changes(src, dst) + newsrc := changes.Apply(src) + require.True(t, nodes.Equal(newsrc, dst)) + }) + } + } } diff --git a/uast/diff/diff.go b/uast/diff/diff.go index 14b246a8..a1ef79e8 100644 --- a/uast/diff/diff.go +++ b/uast/diff/diff.go @@ -2,6 +2,7 @@ package diff import ( "fmt" + "github.com/heetch/lapjv" "gopkg.in/bblfsh/sdk.v2/uast/nodes" ) @@ -19,18 +20,17 @@ type permuteDecision struct { permutation []int } -func (d sameDecision) cost() int { return d.privateCost } -func (d replaceDecision) cost() int { return d.privateCost } -func (d matchDecision) cost() int { return d.privateCost } -func (d permuteDecision) cost() int { return d.privateCost } +func (d sameDecision) cost() int { return d.privateCost } +func (d replaceDecision) cost() int { return d.privateCost } +func (d matchDecision) cost() int { return d.privateCost } +func (d permuteDecision) cost() int { return d.privateCost } // min is a convinience method for choosing the cheapest decision func min(self, candidate decisionType) decisionType { if self.cost() > candidate.cost() { return candidate - } else { - return self } + return self } // type for cache @@ -39,14 +39,14 @@ type keyType struct{ k1, k2 ID } // cache for diff computation type cacheStorage struct { decisions map[keyType]decisionType - counts map[ID]int + counts map[ID]int changes Changelist } func makeCacheStorage() *cacheStorage { return &cacheStorage{ decisions: make(map[keyType]decisionType), - counts: make(map[ID]int), + counts: make(map[ID]int), } } @@ -221,12 +221,12 @@ func (ds *cacheStorage) generateDifference(src, dst nodes.Node, parentID ID, par keys[key] = true if _, ok := dst[key]; !ok { ds.push(Deatach{Parent: nodes.UniqueKey(src), Key: String(key)}) - } else if _, ok := src[key]; !ok { + } else if _, ok := src[key]; !ok { ds.createRec(dst[key]) ds.push(Attach{ Parent: nodes.UniqueKey(src), - Key: String(key), - Child: nodes.UniqueKey(dst[key]), + Key: String(key), + Child: nodes.UniqueKey(dst[key]), }) } else { ds.generateDifference( @@ -273,11 +273,15 @@ func (ds *cacheStorage) generateDifference(src, dst nodes.Node, parentID ID, par } } +// Cost is a function that takes two trees: src and dst and returns number of operations needed to +// convert the former into the latter. func Cost(src, dst nodes.Node) int { ds := makeCacheStorage() return ds.decideAction(src, dst).cost() } +// Changes is a function that takes two trees: src and dst and returns a changelist containing +// all operations required to convert the former into the latter. func Changes(src, dst nodes.Node) Changelist { ds := makeCacheStorage() ds.generateDifference(src, dst, nil, Int(0)) From 5012732cc7ab568517dee4961b2338a47deaf357 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojciech=20Jab=C5=82o=C5=84ski?= Date: Sun, 24 Mar 2019 16:51:41 +0100 Subject: [PATCH 11/12] added dependency to the makefile MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Wojciech Jabłoński --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index cea5058f..5fa3b3fb 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,7 @@ # Package configuration PROJECT := bblfsh-sdk DEPENDENCIES := \ + github.com/heetch/lapjv \ github.com/jteeuwen/go-bindata \ golang.org/x/tools/cmd/cover From d8d9b2585963e7e3353536af7abc3da1eaa516ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojciech=20Jab=C5=82o=C5=84ski?= Date: Thu, 28 Mar 2019 11:05:55 +0100 Subject: [PATCH 12/12] moved python script to go MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Wojciech Jabłoński --- uast/diff/testdata/create_testdata.py | 33 --------- uast/diff/uast-diff-create-testdata/main.go | 66 ++++++++++++++++++ .../uast-diff-create-testdata | Bin 0 -> 2023789 bytes 3 files changed, 66 insertions(+), 33 deletions(-) delete mode 100755 uast/diff/testdata/create_testdata.py create mode 100644 uast/diff/uast-diff-create-testdata/main.go create mode 100755 uast/diff/uast-diff-create-testdata/uast-diff-create-testdata diff --git a/uast/diff/testdata/create_testdata.py b/uast/diff/testdata/create_testdata.py deleted file mode 100755 index afc00669..00000000 --- a/uast/diff/testdata/create_testdata.py +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env python3 - -# This is a python script used to generate test data for the diff library. It uses pairs of files -# to get diffed acquired from -# https://github.com/vmarkovtsev/treediff/blob/49356e7f85c261ed88cf46326791765c58c22b5b/dataset/flask.tar.xz -# It uses https://github.com/bblfsh/client-go#Installation to convert python sources into -# uast yaml files. -# It needs to be configured with proper DATASET_PATH which is a path to an unpacked -# flask.tar.xz file. - -import os -from glob import glob - - -DATASET_PATH = "~/data/sourced/treediff/python-dataset" -pwd = os.path.expanduser(DATASET_PATH) - -testnames = [e for e in open("smalltest.txt", "r").read().split() if e] - - -def get_src(name): - return glob("{}/{}_before*.src".format(pwd, name))[0] - - -def get_dst(name): - return glob("{}/{}_after*.src".format(pwd, name))[0] - -i = 0 -for src, dst in ((get_src(name), get_dst(name)) for name in testnames): - print(i, src) - os.system("bblfsh-cli -l python {} -o yaml > {}_src.uast".format(src, i)) - os.system("bblfsh-cli -l python {} -o yaml > {}_dst.uast".format(dst, i)) - i += 1 diff --git a/uast/diff/uast-diff-create-testdata/main.go b/uast/diff/uast-diff-create-testdata/main.go new file mode 100644 index 00000000..101d3855 --- /dev/null +++ b/uast/diff/uast-diff-create-testdata/main.go @@ -0,0 +1,66 @@ +package main + +import ( + "bufio" + "flag" + "fmt" + "os" + "path/filepath" + "strconv" +) + +// This is a script used to generate test data for the diff library. It uses pairs of files +// to get diffed acquired from +// https://github.com/vmarkovtsev/treediff/blob/49356e7f85c261ed88cf46326791765c58c22b5b/dataset/flask.tar.xz +// It uses https://github.com/bblfsh/client-go#Installation to convert python sources into +// uast yaml files. +// This program outputs commands on the stdout - they are to be piped to sh/bash. It's a good +// idea to inspect them before running by just reading the textual output of the program. +// The program needs to be ran with proper commandline arguments. Example below. The cli arguments +// are also documented if you run `./uast-diff-create-testdata --help`. +// $ ./uast-diff-create-testdata -d ~/data/sourced/treediff/python-dataset -f smalltest.txt -o . | sh - + +var datasetPath = flag.String("d", "./", "Path to the python-dataset (unpacked flask.tar.gz)") +var testnamesPath = flag.String("f", "./smalltest.txt", "File with testnames") +var outPath = flag.String("o", "./", "Output directory") + +func firstFile(dirname string, fnamePattern string) string { + fns, err := filepath.Glob(filepath.Join(dirname, fnamePattern)) + if err != nil { + panic(err) + } + return fns[0] +} + +func main() { + flag.Parse() + _, err := os.Open(*datasetPath) + if err != nil { + panic(err) + } + + testnames, err := os.Open(*testnamesPath) + if err != nil { + panic(err) + } + + scanner := bufio.NewScanner(testnames) + scanner.Split(bufio.ScanLines) + + i := 0 + for scanner.Scan() { + name := scanner.Text() + if name == "" { + continue + } + src := firstFile(*datasetPath, name+"_before*.src") + dst := firstFile(*datasetPath, name+"_after*.src") + iStr := strconv.Itoa(i) + fmt.Println("bblfsh-cli -l python " + src + " -o yaml > " + + filepath.Join(*outPath, iStr+"_src.uast")) + fmt.Println("bblfsh-cli -l python " + dst + " -o yaml > " + + filepath.Join(*outPath, iStr+"_dst.uast")) + i = i + 1 + } + +} diff --git a/uast/diff/uast-diff-create-testdata/uast-diff-create-testdata b/uast/diff/uast-diff-create-testdata/uast-diff-create-testdata new file mode 100755 index 0000000000000000000000000000000000000000..7c0851a3bc3497f3bc9c668170446ffd79d12dcb GIT binary patch literal 2023789 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 z zu1G(Tg)A-y@Zao8n&)#|Are=nb228MpJ8k@c}^f5ih(Yhf4=e_T%1+sF8Xg3^mT_3 z8BqNF(QSa47VLR}w`_FwpaypLxek3n#}pFHt91pEtt&cM2N70w-k|X~^W;FLOVpe# zf)Shzm26y2kZrZosx)y@FP-`O=tAIPue-48Jh|o1VPVLr+nSyzWC9sLp?!iR6+GJ( zhu%<|tK!Qt#a|G0P>FodY(5(2)MpV&Y)816l*lPz1Wu=0y>{krIBbZXi9Vr%K&~f` zIn=FwZPs_#J0{rTx|4$j!jaXf`m(NQoR*R$hmzgLM#hVeqkGLE`rgb=kc^0hhuKwe z3-)XyKK1)u`i;2r9+w#L`)%|~sdVSAxXM<>zh+H(@L`U3#cZ4OUV0btG?#jx zQ@+q5-r$V`bc~y=GFM<7?-LwKc2km9<2yTm{%Cg`=b>@Z*H_0c(`Uqmfh}=iw?P0d z)J9CZpW?A4(_(YZ&uJP3TU=u6ZP&Z2-*wB@Q9Qk<|Dm&B#%ZpkhNZgaeQDdzp%Z|kC8WmUpzqf9d<>a?W; zpc?IUbdjmPuex}I|5+y!vls9GpyiMICF0Zbgb5#LklzI$Z97@V1sg}E6 zaK~vv=T9SU$8j`QUJ@`0deRCd&$&}IUua&NLcwqXXSN7QT3Xc z_*44o;ktHOZOb;6DU;u5?8b`tZETu0Q!L0rlrDGm`_Z!JxnakM{E^W(8+Uw^{yv4r zZ^0LrejlzZ+fm|kWyxxZiKekyv8G+z_xG9d=EXi!u1R&Gnv>q~I6us1{hJ4Lw~PZ? zLqO*7qq0KD#|l!9nrGD;^EQ&}NIo=fRz7&>SN|-5ZV>~TWlFTIpLY6XV|Eh0SdhXC zdIDVn^a^UyA>fC&p&O4Z&7C;)+!`qc!@XuO;8=p2<{BN zKX>yav^d#=QdtW@&5wM|uyBq0E3+=zI70_h;MS>9U0cK444nEvXV$Fuj%556+b3`% z+~0BoGPF&3c^z)`Nu!3`_ zG4{M>{)nyAoRgT)ZM9G1^N3Lg#|E%dx^Vs>>8p`0k26g+u*D%8nTt}dgPYltuuZ7~ zAt>`T62mho6)z*)5v*X(l5YW_3`rvGG0;;z>5efkTK9jtAA>c`BoNW?im1?+jjw(%Wx(bECz$8e@7eN zXvqSO{Mv4+Hh@rrpaU1fN?aV1fly1eLFgDkXsYa(4xv6n=|I1s4@eU-K=La-hKgCJ z&N&k7Yt@P9eb5}+S)gO$4^6+1jjWY+7S5{B8A#_7>ho zs+V2mMXK9{*x9c|5-nsOLxtH!UUVGWEtnDxfq3~w^n)7Q`g3cr=?XVdiH1?o*Vs~P zYzK{Lh?&L&HEWCo%>S~nJ7KB;gfZX-0BlL$Ay}loXcTn#rCW_j#gt4WTbjN|yb5`Z zKKVMlM^%qK?@wLZQz?);eoJbj;W%qJ-Yk;NZ1LIL?OBt21zq;GeY0NhBv@otMQ`$eXTR%A4yXZ{&>{xeae-maJjQLn4$*-ptU%GDj>& zP#k4B)nI&t#{;Q3p-Nj9l)_AhJk&RkxPvSEp0#lq*?Gjk)K~6cbv7lIM(s$>Vz`L8!-HM!Bb9FAwhUHXu!`pAmNK?;MYXu7jGi=` zFJ(5LQ{c?|sYqb!(&PBy+zkGroabsHW|97eoLMhLlf#b$O#5ZPRG%oc34V8<*}m&D zTNhK9T}G?FE4(!SL>fe?c!3j0A?ys)4mr%{g{eXfb1&0Sf9FJ3rDBFL2DRFio}pFz z;QPR`uHsDL$2H{{V?h*}-KnuajfK4Z?nPw|?_G4MaIHrXCW`kmLtk_Q|=KTuG#=FDs$m#E8 zePBcS4JzW9djP>WW>;F?Th^pE0QZ|j15w1!|)3l9EaU1n+<24;QYf;KA>RH%oc{V4Kz|) zWv{Q>#cL=`O`_qtztTM6w0(sJ1Feqjf!p$Qdq?@rY8LgT#eN?%bthe3+nvjvJd5pg zzv|61H%W9fM8<7*wRb{K{AKLd?PA$^59%`rvB3>C(QxBq$|1)B#_21udOO-n1-q_S zQqdt$M}-)mRNToBwsM5m5Q$c{0ozv4TqM0p{gJBKqVK0uW1ZA**)mhbWvHrwEdzX{ z@D_N#V2P3jJ)I`%Xd&`;@XxjCDgNxK= zn%_N}^=coz>abVd_Ls1mK1RV4W%SD;Ti^EkFU-xZ`2f% zK0$*FI}7q+8#cA$kpzT{$Ooa!V2o${zqG!wZ?R&mGv7eS_Z3uz-6zL7gGG35oB6PW zhRZk`INOZZfWdEzMz1TMo}Om%DLExKw!L)n-kpfQ-D{sHrUmkSCzma*-MVUW+48z} zJg9U9eoTJ9LHpxNOLRJBce@GojT?f4rwitFqlm z`wjyr9S+o($={el1Gl96K30l^LKHfm-T;8q>lnzc>DO=$z=;Xkm z`}v-?ctJK%0R43VOU`s%lw)_o}vjXyhn zSu}p1?_41K)IlYvP&0Kf0J=aNUjy6Iso$RZEgkGkdv;9${pK*h-fCz5P@cHK%BTAH ztCOV!kW_`2r5>+Zlx$ku;OisF6ADO~{c<$Eovno;Wv_^j8lr`-Bl?IZ|HvQ{P56Cb z#~SfXgJh5TBx&5vZ=|{xjx%#6FPa=fPTr?UJ(hwCmC6?Y1QrM|DGF^p#+mtodc24khz*@KM9MZrk_}9H9PGF;-!0r6 zDSMG^f1!!IX!RS;{9>w^+&-?uO`et?NuHIP-kn2fsWG3CEQwZcoV{uM7HwQSge^fx zdZwe!f|0R}&lSEDZa+*Wym?D*mPgC7^e%5J~3X^rEhL8%$o{*^W-fz>Iw@htoE$`%GNc0fRh*GnV zL1+|`Vvsh15|QSz=h7mz!K%$)T3bpSdb0c;yS@(5)%7k_2XNu@V(*h3Qsm6z!7S{K z>q08D`X6NAmpq0ky49ByJnK|t+^Zp4ucP6x8xI|?>qxIK zkV(xjPpO7*rtN;`cOcWz^edsHNJrw z-anrHQD%kXnkn&={rbgM3ZBjgeUAXKbxlYb>do zbou1=%b0Gu-j%OmNPT>+6@0l}2T+A%^P<|8^1;spSZhvvwovq-B+O zEuA6@8BJG^0I)8#)yB3#$~vpU7kqiF-5wH&{UrE&x95_~&KQvlR~0{@ zpcOMCtG`q4eF9FqK7fUAXGCJp?5KT$n)J3l?%CezcmkZ(^Lc0|#JwcDV5`f9Wyv|c zM1($xD;dB*Kk9P6b6(!E0_1or>T2+YZ?5J z1PD&-(-DnlT-fGPvUs&99WI5lTK(x7-mZ|)s*EHj<%`p+yaWe-fcORXUIpds zOCTxsY_YT8SZz1(_+fliyZZIovaZ^#D{ITP>)gA#!e`sRIJgQ_8#)1Vnwx4%szhf* z4{8RpqUXgd+o6ogz0=Q-SrLtwlzUfS>|4$SO0VhUrKE4MFge4!VyfA-D;H*czn8vm zy-a3cP(F^N1Y|ROS$P?+yr;2Eyodd-AIrAezoM^S`np>8Zk=d9?fy?$*zOKmj*fdj zN4%Mid$F7Gt(ZMiuW5XcOEoYabdZ1G+c$U%mW6eVFf4P#zaUnD7-6;;9ifw@T#%Cu3@uEzoh)mJyXK9o|j5mcM*Vt zbXruldPOs~a8K$I1g_UsW3+jL|8tf9GsFM6%>TL2|2fD1Io<#H?Q!}}J+AP|&NE*6 zz{}#LgK5dDn&!JyDl}g28Wym_vbWroRqP8YHo}VayBfR(N_yv9z@Ov&s*iam>l>^3 z3U)Iy@4+pvX1zL4)tzduyg#DAroP`7U?0S9g+>d5?O)%Q6YE5jfeNNb!|6jU6H(?9x<(%fmU3dPF zpHXhMNtP;+MMGZ$yr$+1m8m)JJ9=ceq$I_uiq%ZJwS4lk=8=?~svb@k(S*&M2Fg?a zlm!;Hw#f00KE*J7$I$Uy zPNVfBj9sU`mb&9OWT}Lim1EM^xEzb%=B`OQ;r8(`B%3E$Pn8pT)q6Hqx(S9G(>{a) zzQ3#Q`#gPLO2Wv1fvL97s14`0c7u6U6|PVJR)KF6Vm3HAw>%d=Uo^fJFU_noQDydF zn{&7l{U}<<1{*uU?m5mL8PJ4a_iBU|BC$7s-LpRI&dGw^-2ezHGG}&$R=@lDA`NVa z7Ivd8<>%Jphq4{yf!FesPJ=>ZvPoF_-9E_HV^dn#CDt{p9;XYoGHEpGE;xCGmT#0o zSN3du;TqKja^4&^bCq`ET9qCKx`svLAF@)8kJj^186UmHqS+fG@#k5hj^STl_DX%> z+ftRCC*B%1^Dk_ovI&h5EB-@c#$GZL9_I?T&S@w_T>v3HlCv-5JNQzx@NJ3Ff=KW3 zXm#gIk3Y`57D`9QbwYwPy2=Nt<@dZqz0~H3R$@E2TFuoWS^4hcNIm__O@FbjeP8tK zG{o1v4U(l~!K`#-9Mc(R7)W=>#`~(&z%8n{e(z4xgg@-xR-tTjBsr7a4>r*p zs(!SrGg7#OV`#>k!V2!t4wt9$Fh`>Cx6^FUzR8V$m^y{=uoVNj5T8_EHBBn^p1=bo zJQDv0rvXOGUWyjJA5G?KCx`ItH!Tiysiuc`mjNXbUm;caL*}j?q1{Dwdji{WTO0kp>+pwZ5-4I{d3TRNH=7q?aY1NCEb_kS7W|p>4}m z&$$67!PoY&qLoyT)4%Go_qqDArw7%?B17aQvIZpK0$ZLsUlx}hEb&hxWQ14*?+(cx zp)@L|b(ufHJVuBECwqi&`@bFKkaS(vCis~PJ-hVcHI{`5m@>D87yrljH6ucJJ!z$-2``@7X_!eNmlv5>tG?T9V3AL{# ztpe3SQ(u@Vc_`U#=)zoa5R=@)$^3 zR;V%K?iY!BBV~T^U4_1D&?H*PBtX{LH7LBPuQLwo_MraWqlyMBiJ&uUR{8z)de5fL zWT<#s=DyVL8x+F4o+w&M!FYS8ws%h!-D_VB$6h(t?+H5`rX5s_NV`5iy{AI+%G~Yq zX!1IbfrU0iMjBkaVb@#k5`J=q6b}>?MlhNYlrHfW{fQAMahMSd=>Kd;=DkwEdbD6Y z+Tvh7K%c%9_0xcxfl0A6V0w-Ux7U-tZW`3zNd4(w_*flKzcX(?U`rby<8stx+CY0i z7j4ByC1uJVjT7^a{AP&G!n3Ek)n`{ZZA%2%f7CmFrI1eXi~~OZh;wz7Ovx!^T~nc3)wF-2sF4a{U3qc0(Qn;!gLvKY z3Sqk#SdB)WhraQPER~5Ec#cO3xvyk4CbM1@>DAv)2wt6+9YD3OR%Ko-dMWFx3VpTE zUU|ibn%1>9&@|Ov5F7-*xq`v~92t#58DueKsNwp0shlE^{2lh zo2;2`iLzSY-H-3tsD)2bZM^ldd~Q!g`T?VYFo^0SpsW5!4=*$V8q~ixcj{jv^x+Gt z5A-H(6KPj3ZmLc;?qHF?F@~Rgs3&L+QhF{vBqtGiD)Y(wxyB8BP4{;~97ESjyeHTP z2sB-s$bzcjV&z$uPFCWIL`%-JQk8$qDrHI3zwt{ITdDW)5_sD&6udY6TGzB^mACxv z-H$gUH9Y|cdYP|$GVl942p)%{Jb|x9(R+jF9Z7;>PHsiPij?a-wG8b=M>(?}m^8y zYm~6vTZb{FCu?_9Pl8WAhX0aR_HJ^1H>)x1+|e!fP&nMW#c8|Ie^WiHv8fw3qQOIN z3%s>BAN^L7F2VtO2V{mtPX*o;?`7Tz$S<6!#Rz?`!!0$JA4cz*3bY55c27~*oE@R3 zN_8f;R=Ic|O5vzJtI}zG$F5ia^Qtaj#;KcJr)y%Rv#@q5>ky`+hM>~RTpG6+Sbd4C zF%>9osTrzPnlFmgjF@nV%uM|02~=_iCn2tjv@A-^0i zO+l{L{0o%!PQU6asT#{{gjygRC^wG?qiI}*C@`i65QWjhujww7B6@hiSrEE!{3u)_ zfB@lkVe5ZL0$5uj{yIh1B9w%=s49&o2m>Pf@>-& z&hbuIXWrg0xh0u7-)}Dqv6R;Y@Z=krdb1E4ysHH1wl_6RUG>{6Jd6<@79T4*=hYn# zWWBOPp9k!fSNtd_`qn@c4WfT-eh>YJMgP#2{s1TTM2{52mk*d>D^(KxvC(E&+8tXq zjmw3@Pb4LpGnwW2o5qk1U}|FajawAxLjeW88Z~OEASGZjBZk|X%8REVlSbs^dVeH! zT5XQDT7JdI*y+2j`~V39d3_hNEEILOb`BH9Yfz3-n6;`-A@Dy^I!I$?eP5a-c%Nzs z#jLB{ME)A7tEX9D9!D?>|18^sm3kxx#NN)!EbxIS)Gzq4fUc1!q4%;IjN)Wa;G+w)(R) zUpz$xYC;6$+CidU(ldHdY;G05KZ`%wVd9}w&@yjmt8d+HFKU{C7PNcQNOfqcU!N+E zDFtXf`W8fT;cHn$ax`VU%_pO#)u1`k2NVX@&#`nW{iGVJ^zQe+dh_9|ug0p-llp2{ z)>kL;mGPFp&j4e9gp`*N@P$7t@2^AY2G4C~pDKX){ToD&%XUGJHX-2wTx;hvrL*Z8nYPQV;0;Xgi=xf}g*wld}^gNHMDv!-nJ0s3A}PALl0W~X&;wS|Ib zUM!{c7rNCSIc-1U10_c##;!RS{iOF zwP+js32EK~={%Fjv2DtCC}%f=<`CEZeh)sOEYg=)srMW;GG{(=!UmadlEjA?sN`G( zAbvKLrMnYjXHzo1Hhr5?#DwSq4Me3Z?{xyDd`O6YQ%6gBEAAqOgMwM`zSAeU13r-h zx>EB&MQRh2n)OMzzm?}%7o63~iz=85U36;}m5fxM4>-!m|JH|~`+WuopaJ-veJ-+x zE?&+g1UrPk1+ZoE48b;BZJph|1leB6_dXESUm#LYT9&=hB$L=_h71q_RP97s3Q zYrJBbPv0_dexgC7iOf?P#3nPr?ZcgpP>J_$zE7#8ZhXM=-?QI^=+-xEGqnyF539X| z)q(yNngFAIRj|IASeoZI5%!;hFmYYL`-iFukx>@!cYiQ|_hZ|KlY|FkP^DHhJ4jBS zv?_rL2P-5)e_Ne}kxF6Yj;dg`IO+RYugtK%+Fp4Z9|T!CqcSrz`yDjC1CbO1aTcrb z4x}2V&AiRY(6=fAt^d@B#g{m3%#2h}^YM3BSM0R?Qg@Pp#ridx z=7No%kMu2rV(+udRSPZ zvm~HyXM4Dnq%7bc8pH27Q2PXaXIDj&`71d>zBE=-2mk?%G#6W~!kUYf9I_U*{rOi` z1n_P?PEZj&t%Pg+*<+h9lxS8?@B|6*v#jh*Q^Hb-5z+F zG%;1;{f(O_se;^8dMmg|FVJ&&9-uyX|BN(Ocwo}YjfXY z{f}_&=;CxPlSRHj$js!)P~4_k@%eE}b92(K;9UBv*GjAD+jsIuncrgYl2t7rk_2E5 z)r6TGwU-SHgK@`XWGw7wEC;8Do*sJ-Q48&h3&H3+wP4g5u=KGZB4(&$Ab2~uQ z!c0&%S@bl|Oz21tD|Sl6eP(NWM-k98oNHEZOwBSope9O9-k*v6rpXqS2PGMrYgIs4 zqd}FvXw(Bi#UZ+Ot7&};gyfMX0kd2 zj`*RbE-n1oOxUfnI7)++1o@ns-h~gTXLDt}RL%z^jCco}XxH3q{#*R&r|eZ5+qfUQ zQI%4QOq){E=-Gg^Pfcn>|0N8!6EY#?+65I}WIm(TJg{GM70>+^d~RjlTV zYO%Q#*msF>Bm%oiGZ*G1NiAabM(`wHvrL~5gr$_93t&{^s=c{@PGbdf~ZCAUj= z4RG)3vOqXIF;P{7W?cpk8G7Ozl@~9%NcYLmgH{Zpo>b?zgpF)9olY&p$8jq{-tti# zV@>(7yOpV^@0EBfmL&{L720=vF!BECwyal{6P07HytDQ-ae3kWpi^<3Y;l?8zs4?$ zpju*cD)DpV=rTxF*EfoTyYc+;O#H%o`-u$Ll|lWOUT2CWi}n`C;LcWCkCQA~cH_vL zG?Fpi2`7oj#H%;qxfU%|*Uq?VsO@7h*{z=2LQPkl&P6*H&YeqI*EfHayAD0B=Hjlt z$9r*ij~;)K3#kq4jgNQWZZ{DCVD8f!c#3tF_QtPI|Aqg*AN)@FL;lc~TYtxylQ)wO z&oM3P=u;tq=`3yE=CuBf8#h*6?8F}63V7aJzKvF_;5|qm6^y;HU(2T>owmJHHb~mX zggxufXs(r>XD4t;v8rG zxw?^*j9Nd(aKd!3)~R}l)26*}spyoFEsLo~aiJ$vkF)T~Ls{BDQU`swx-xf%vv7;j zpvZ^6`3%X+>aEWFdR>g$L5616JM18^I45Tl8J?dU=a#+f=58l>x0j^lOPjA_lOC4jba)F`d~3wwXNEf*WV}e7;kQTdN`@Y5 zmH-J7$CCkBa{q|EZuP;+y*?9zPbVv382;yN{Yi$cLK*|t~zmOuc5G{3S@Vz>h!ZS+`$CP^?A5D*9B(Uc+*Da#49EkU;YR1N3 zX9V3*-lEdgQ!1S{0u>A(sF_W2_sFjFzwBjZ_zd^XzRI0DI@9+*Wh4DH@+rW{UHX8d z;kD!uaQV0WIJn1N2hU-9Z~jkr24AMHsV$OpgSgInW-pU+`uOal^fA&}l6QurC&1If z*i4Qkrm}ZlF)1X)U$T+*Z_Q>~)+hrhIqJgHL4Vk`=4f>8!J~8OlPSA5LrkH`=IK!kFd{H4f zG`z`g%|~=Guf3~&?6($HYgPTNJ#1b#zWMoI^bJ^-_E4)&?#R4)U}@H?33_#P=GE&q z?BFYNB%JTRq9!kPWCrwupt{URv#@d^F@2*9s6T+gcLd3eLBJb`^A|@7Aaz8K)#3H5J4p-w+-r@c51^HM(YHy zmCZps-mPqz6VAbvfbs~_T#g&YTnXG(*ul9tkc=2VleLK6RgwN{qOn5D0#73lQc5_G z7FIQXnRB?^+y?H8$2IV!ZYsrl11c3_6O9N6)hZgz97GisLQB(6D7IpR8>YX)A^kS~ zF80#rW>gW1hH(s+F0HM|Q8{vNwS}LTLahSuo1e)7q9Hnmw2hi4vio97sk8oUOPecHJFhmF%9`;& zZFbJ>@;@R&`?&PeQp>>!rB7OZJYi1JOGTCsE*a`M zD+@N}gWPksETCiWZp&*fnl`ukJJXuk&u+-HriPAwCfw(jK6Mwn7xkcKJx&WbPF)W( zlTMHrUABUm?+akPQe;+Yz6eS1i`A0>Pv|ZaO{R=D@du2dMq|kSHvm7guiR-YPaazU z=mMS=9KD0mzAp{(L&_i>MO+vNzc-noS)zTRZvn%@!H1N{@xHNbM{jrNn#0W!?CaKV z?xtJX%wm`H@{sBtKrhfgfGP8s$wodQVXvwO)qkqLq7p8? zx_6d!?LND1T&YfB`)RL(RT|FY z;46wRPlSH6huT|3dnLu5amcg{Up5|jU?W*fWb6167Id_TXp9VS_4pXC4kVMhm)oR5U zbJYEph@+V!tGF7?KN34LvAVW_QP|9T^BZ@B(!MXgNT z!<@nEvDYj%%&%q{H&2X=Kw0V#dwuS5pPHQ~-aRf=VIG9lV(i!(xo+X=fH$6n7nY^g zqi3tWDb$zBr>GbHFF5mCJkAn;iO{rS(32=S4VQUa=M(qLLx+fx=QHZpr97`*>CFGJ zWKd%4QSzy`t-o$oFgGlr@}m8z9MbNIbzZE;Hbb4?qdv0QhET10aGqP^!M0E7kLyIc z8o`EU zo9hGv1~ua1^69$49mWl=LjK|;(<4*&LMtaQ7JsrC^;^4EC@(SgS9YyvBS5(M3Tn;} z4>g#tjf`97E3Xu#7fyWkvMf$C{r^a5cz^=6g?a00Sde0CPRS~UV9)W2DaN>PCQva2 zOJP$A-n3J}cSvqfeMmQojq~ffVW(o96tns?dJ3+Bv#n$3crr2RS z6`PT%4?}uq>3y2zQ4Ou75SOAgeD4> z_-%FXRB%0Fnwmq8{z+}AXbK~U{$H?D(MKfF0b8jJbF)9pN3$idR4Xs;*GSO7ukUWZ zzOQF%nY*dr)J#FwFF3<5*nUP9JPK9t$V|Zozu*ZJ^lpM$yekd}P&Ar1fky*hMGIeX zlCdNJvZ&kFlizm>H}z8<68Cz9EJGjl$dgFi+vVmUzKl8@+laVXp5anJzbrLk=eH&$ zkaq~Rm3VOl!-vP4PPXfQcvq4Vo{A1~_@Z1DxbZ`5eVAa2vOR|*Yi}X3mT7$MZYZD5 zEn#jDbiu~Ba_;WW6Lw@VmTFZT$4#`X(4h6Qfcp+@pBQ90$F_%@q&!p9Q4(xKc4}ou zV(gcxz9aE_B6~TBC(8L7e?r%_@l9QCkEk2pT^rvverwnJ!^ZEZi!ZJ1@``K6v-j^! zD#_ZSiODg;Oe5<`m*SzkxrG*zrx7(7yY=g66Bn&QA^Znd&b-^zvqZ`2*fqm(iC%_a z?{E{RhVg-}YI5k*7{621r&TtO9KWiSCAh@BP}%@XOzX%JKj>5q7_n@YzE5*LE2Y+T z$9~7NTzBcD;#WWE?X^IijG}e6o<8f_zDfpPcq<6Y|C{v`wvG3I{BiWO0*T1h-4SHM zSS5LAu|hxQ#50YP&HSP=QLMc_xsmlMxnd}a(hyDf1ju|y?PgK{3x!0hNIBQt*{K) zL7%gQz)yH%U{2l9cco*|cy(Ieg9ulrQh17w_gG6Z`Aw= z>!s2Rwhw6#15v1R=2ZmKy)&ZdwnJo`{URjpxjEmsr|8E#Grj61kQ;Oe{iJwo-9mM^ zaV^u`I_^hZ$2~Q!cIMqpNhylYqVs-r&yhJDv6{s{kxtiI#~Uo5Ux-1UE>gH0i zM)U`Ln^BFOVFgwr?{3^p6}51m{zJehO9J$veafXYB6Oij$3v&-CmE{K&-~)_Jg$oi zMLx{vOFxn{WdzibV$A{T)i=m#6FjNnNgzK`BXyk^`;UVJp2I)MC>{ixzuRr*oYs z`Y!FYExYbe-#9ixIP4Ebxn^WvYS-tlh7gv|E^vyMr|yHP&}h>i>CgLs!`%ObZb0$f z@)-DHtLSizC$M$*wrk(k{p}e79=5Lc^RcG&{PP=GJZxtvJb{WKf#fTTpMBYieeKMw zVrEo+FDT~gfG_&RCZC#BYs3`(*26whHGTC=40|f`(#8QlB@G7^3$Tf7EwotK4SIpT39YM(pkzn3w=|BOZsGUQijy1s)lfvS=yYLY4tZ@-6fOgEuRxK(D#*e8P#CyS<7 z31%J3OxZIlGvyv%xgBQ(==P>BK_j7qxMeqiSk2U2DMypLG?`TQ%xezeJ)&HsL|J1C`yOkZibEQn-o@SQse^X5awh5CXahu-8 zKFM`%y@Xpg_PEVaPTQH>btKR3jo%#DAQN8JzbT^Om=crKyQfd+(^6cxWPhiig7LSae2~1zLg_bBEhyfTgw1bEI>_^#_njF8&Q-$DUDDMfM zBE4&FV*X8rVvB7r>Czy8px7o5xpKTz~vGz{RknHwe+Fph05| zE;Y0+L`l6t&?g!+F4eeH<5I+GTa*N&0w&x9a=l!QR;^mUYOS^|ZQW7SDgh0P8;HAB zMO%HY*D5X*&`N&q&za{YPXg`t`}_U*%j=c)&%cHjicm8+#K%u5Hb4`;js8!A=1+IQaff+JhGj@DnqMw~WRj4}m_Fb-1+|?TL zSGP#d5V3G4D-lc0pcH*Fmh!)VlhlRk8NQ}3L#f3^7KHinUv0)Q?77&Yf@8rnb0i&0 z!PBnkG=EZdcM(4bJEY~F*??rXZD1Z1G*0!PIH5aAhlq)K_JDc9bZdLS?pih=k~z6= zF8K3sT!vD3WVDTC1dG!;y!lTV)svCe9jzc`=0pY#qGUZPoEF2hjJ=aPGljg>Y6puK znU9frs`SaVVXC|hxA#&-HB?7x9BN%9^IOv3kN0oXgNAL`%#_l!k?z!3OmDbhH`t`2 z;6^U7Uw5*4^$YiPKx0Ls@=B$dqckV#E%rS@bAZqe@_cHN6|SP_zyi$cH!0~40b+Wm zbKM6v?vyGh0!h}}o2kgSRj4_)2&e!chu1*v{QG}SEfW(-3^qmL}I{ zB7Ae0ea%F#!wKF0MY#4hk(}ajTG`t>>(G2LM%-UqWP{|qn$VzYWAo~r9nZ$q3H)u{ z(0Hd80yDG4U4YT6!P(&4;^6i+sHcJQUt~JqKjw=6#2ej8?Fg?zvAL06W4^PGWbtb2S@ z#K766$VRE?!KAH-PT@D!wkvNmdyQUKLxz%KgAHb+!3+^hLQ1tURbqXf#*@GDyga&c z6K&5Qh3%LtY`hirfW9Aunc1cocS1bI-TORCF#^(?)(xdc&YS`VJHp<2CfYTFxuDHoi0RCK)}3%J}=ST`|O5 zIQylvW9Rr%FQn6%`yQxZ!EsG4)(cuzF*5JuTcUD0xx;Q>Vv2-#g%ibY#tgmr%gIVr zLQm{!!8pm8Rp#QAT%rtd670}dc+Rs>is(8#;X>jU93qi}YZu?Un(yQNU>m=Kz676v|c!Ao&+*Tq1kqxS~exBNwVCR>M8yxbk6)l-t1+Or)=MsGML z-%qfIu(|S+udHjmgCW=4(S&xmH=Ig?K#RNey|+gsDqsGWz2Crl<|ANFLdVL_62{v9 z!vn%cogd@8eG;d5^RLA;_*Gcjj)s#J>f{)-H5bQd4)(TDVy+Y1Cd3d2?ODt#On-PX#8 zCiHYx^mR`-6#YY&y^3DdMWz87DNeTUAjG_ZV_tNZ*L6wlztUj$f6T!W8bG>0-dZnj z8K50@PvOF*;j{L??<>;A?)}^wxc^nW>^G@@AvdZ2j`drV+8A~lFim(@U((T0mOrB6ts=Cq=riu^;N06+E;a%4DXDDu`PufgLL4R{=~cnjQorLO zG~0W4>CbAmFNfs5%;F1>xlO44G@cWchkUI@zM>4xokotnafh=h9Yfi)b>Pd%*{Cu^ z=?_aqY{WwISN11=PmCU&BZT&fULh)^7dl5ybqgti#U!!8%Wi1pM;D!Y{=Lz^9ys55 zKM>(vfztpjk*eo+GQ~+npS4+j;8;orp`+W>{#42Qhf3qt@%FQ>&-gDtKBoJ{{xwbF zL0eJ^{76Y#qRw?IDg0{-jDGP0+}L9HS)qU0&UILIRikVcgA$}Vd;bumdX+yffK-0g z;pmTdS}Jw7v-LF{O>L3vNIqB>dK6fhQkGaTI^`7ji^K4S&`!Yn(}Zp+y31iumj>`j zs=q*#tmhVua)`cCL4DSB(+aJO3=8|K395@Q0v5{2gcqkrK*_ghu}K zO{FDP@0`aMkWd~2roZDwj`AgPO*P_>tV~6VI{r>puEd=&=4sxzlE$TAg zGJg4&yA=1wLn%yM{GC#KqOXv=UYYP0kbF9i>Jm*N0_eq6S;5dsNo1uS1;gXzdK?(N zGfJraKKUNi%J=w)u33C3|*!|71}ms|{l!ie$Q^ zkffq}94cPV$&7*$d!*+Zaz#7XV-Qs|HD+6T41%wpwf}>NWJN7+7k0mN<^QH4RKBfP zwqZUKolH#R98#9V4BNxQ*qW#~F@QD%a?n>h=pD9z9v47gFLZOzXFKRS!UU8y<9|EC zVbT$XKEOdgdT za>r19<{U;x3ocIrl=XjV4R-1VrjcmSnBow{0N8p?AyszWSN&kW2T_|hea$C~l@Qf` zP$`G<0-fU2PqBKm{mU!}G8LS|EpYq%Dujpap8wu=WI4>gi10$0_rH>g+&j^*^^@C0 z=YIaX(IpeaVp?ZU75vHW5s*E0w54;VV@F%lN?3!(ZPl^SH#ywn*%)oNvudfDhPp!k zt}Bd6Hy)x~18Jd3`{kp|G83K67yU_0P^P3YVxlF#mdUzlFalk}0pb)s_EKTUCrFqT2VGbV|G^E3wWRQ|Q| z<@C>Co3fB2xfFTxy$(&$mVaV-+y!5Tlu{AJ3o%-cHJ55J*GvxJsxd@6UDKX%md zhsCTdC+6ajK@Lyy(V3^WcjjqP%g-xT&ms#&4{LV|s^Auv6IR={Ak$m*)Jd3<6YwJ) zLK94sT{0cU9>kA@daFnE{T4P8np#Yepw*&PJoaG;oiTS*j*76Scx3mg)c#5C70=*W z)fYA?w=qX%J=nQks8OF%ved^~kt;4*)TtKr9${2#CHVcTe}VQ_5Gs>6Q7hE?jGtF& zxm8QZ7XAPO=HK9Wtt}5w$0PruPx`+Y=rA16y(Cri(L^v@9b2GXHnFy)q%f;OoY!Vm z_yccJ(Z32R`XIltM4C62bzoJv1VP=w%rMy^x{Ask&gC5v9L`xF^?<0Ep4**#OgBU) zZ5+}3c#nzQIR*Gne%j|m;eIUOnl>-T2XgPE%dE+K$7GgaR?g*ylL--CoTawF+TS<^ z0<48`3Cm?f(a#N9%+7qO0VeSc(f9wZyL8b*fEi3?t&KhE7Kx{4uxUSMKR8*7!$-^T zn0_o^{F4ts;7rncZN8xub+8fJHEk7Kt;+e|1FTcmp5I^O3=32kOdN>sscu~LZPFU_ zeKSt|9lZsrGX4X#ha1Ko-U8}L2jxsyc|iHYqx@`eh2MR0sBrVC-T7Yzu<9=Jv6@o?$tJ^mGVH24?0Tu%=Bb?&5GZ{48M$!b7& zSLXNism(t5pPmOztFb5cNU`2Nnx0&`-We;7W8lPCVIyYpPd3tfX?IOj?wC=Jy|RiP zo2dNTheZ*ctD*#q_BJ9Xqw6c+bJizxp|RXb%jqOY6|Cf4MZr`2#^xzjeWLPB-}3uN zojFlCnlE&j?fFCwkNnW(fWR;Kz1=S?ZKgVm1-pAub1_l#`R56mzVD@LZ7BeF2dKFA z=?(M`34nSH8yXUt5|w9LsaJ@-O&IL{w95inMtA7-UP%kUd9Pfm+bz6T+8XE-{xk%- zFlh45^5{Zr35qT1=%7QiA78q!@98VbU3i!_4f=HP9mx<)RO5GUG=D6tOc}3E089~{ z_H761En457)l*&w*9V{szSf1J`E-A6H&3jGhZPso4L%mTQRs9lbZ-jv_vp>8xk>Vd z_!WmRN(5Q8yQ~Imk<~4IvRXHotlkDT!@4E$(_N~a!?m`x*mK3n4+)M0>`!oTABU%! z23IAxg@RKQSmtDDB#5mLWfI&qSMKw7u}<5;JfIDv6LtirDEZnF679q5uILcK_<#7T zNE1EeK=D(wOl~Eq=y>-u)IEIwNAPVBPtBG8cwZV_p_dA{zvXFlhGii`WGea+&SN5V zIhs`8XnqW?Ten5N%MhKt+ixfHOiZ@JD~Rfod02}RrJF(XUfRLGkvkf0>J=fOu`i|j zonHpsd-t%UkQ(9t!9L*|eSqsQwW)&B?N)<#s^}uSKb|H}jhSipcG}+lzq0!V=@pgd z**)i^`!}Gpfxx#1g%Ge(?xVfLIWvrN&O{OdHn%JUhGhi*#{jI>z@8mwU{kgLJ2L?D z4D5CXcK&{$+>8qj4!|6{&OrcD=)Pe!-@4MM0Ic3}JHdhNxkYaO6w*{7ZeaU5uw5;x$=)KN4|7yZ4T_HecA?wKo#u zeCWn}fuHD#cO{CTXgAB>Alb1OwMZ4TaAD-zNyFH*<%x%cE{&Ox#l&vqWw3Pid*m=b zm%}e0yq=o^I{ew?*hTwGNR^Q7QoEO7FkN(-!D+v;($SWPKx|r+N)RC#A5(+AMB9%> z28}fg9od-k_%Aa(RD$B%80=Dl&>WUO#}rWrGCH;28Z_Y+BwRdl;h(d+!HRzzFDhDN zG@I2rx`Re~nioELx_p_x=Nr~}esmT@e9{r|KlPtkmCU^ufA=9_F~$kpHxw;^3h~rM}194 z%W~{^2mya-zY?Bt0wL%<<7z2$xWYu`NJDL?oMBY^>^cIo6f!}tk!QiniOMhEu}=4} zD6>5Jrr1@t><-AW^wnz0(DO^1H>0&@4^to~7M=Gb-X+14?omF(?O8slOc|)0OUhV6 zpr~~$wBq%beIZfVW>7n`1+~+Pab~MIB}k8%DlavvGkdqibxC%T@{g8sMfNqyKQf2U z0AnptB!P1#NsfG^Q{uA+x~sR7-qEg*qE?F`=iPK_CEF!37va}1Cc#O+o2aB>SP z5rZH*n1C=kJRs3M^up@ifL5G3;BEK_cSR1(8h&;4nsqhfUi2znnAyZxTIKQfi9hm~ zCDl|cXE?8TapoyqlXvd^0f#DV&fdqNT-kfPidW}6Aozp4^x@_0gE)my{bJmDt+R04 zN9RVuM6Bn;4)vD_TEwt+jPX|1jpsFB1NVtJ2d6 zWZrz;^~?j;s*!QQe{|xzN2h=D%WV_hhILd;dyN||dlaoWLjSjTG~VOA5xukn5Cy18 zQ?IjUzN;*2z2tCM%{Hgkh)V;5D4eT)tiJCz(*UY%nZA~5qRe<_!@EtuuPJR7HuS_e zP3pGLVNT}24D;G0VQp8W+@)aV-9*)ZmKxq;=hF~~BNkCIuw9(>cC~=eQ=FLF$qUmpX*&1U2Gmgxh{sN<4dwi&*ef--4 zf}qCZ5faUg5w%mC{l28}Uut>E?-_XL(DY?FsT6n>d3d%}ROL5hh`HY%&Pc2nx7t8> z&{q`6f=Sq4q8K#%W2ARkb0m@d1DzJOe6P@;GF)JL24J)#U~i+5_!oW6&zUaY+4Z3W zJ1aplWAymqr_kfO|F852$g#7L12X~i_-c!KhUoz*wh>kSS9#$u;{}?+~I2!0Vb)!A;w05J)-Rf_w};%QS@A5U|V= z^@Sf{@J4&MZ!6&a^@%^&G`eqmTQh#r(=`0b42$-;$jX-7H^;$*}5pTkiPVN8}teVwg7lp93#dOc`4xJlI5Gtt$O8HIN zHl5_Voga)C|7~)^_;)(9+l>D*xw-SR!tw7WZTC)k)Q^({VMwa3wwOuh1c6y&TgnZ9DunpH>iINP?`U9`5qMZpWapZj{1jHm};IDqQx%ywCV5G z|IR##{#Qvq>g_Dt^^?zewEUKRu#7%LGu6^e$CS7;Yt_Idu7UZg&D%i(Tl-FIz;~~X ze)LwuKB;5NDvm3QUA>e|K~zW0N*DD%fOWG=dY?z?`93t?*V&PlA8ClfC)r1H4C9G4 z8Y@t%@~Kj!13mivt6}fG3hvP*S@5zhse*^?2}Y0Fdzi$@32!;sQ$UxuoEmcTSI9o; zf)J_p;I03{2S%y`>mZdP{%=8_1W;Sj2ij1$)-g~x_Xq!yNJAB;m=x2wQ;}>Yh+fh# zjNnVf7t-NZXI}~WVlRR)k}wlv2RNsr`-N?e#@Ks146i*A4C_(y`n2DyhAnXm+D^-` zDP{&UOT3CM1$Vua#(Yuu?Uc>T8tkP`${vmcKoKCm ztV!b>o_@ZNQ5?tq{PZ8?xw;KKKzwj%-@Kl{g*YtF`_wNs|K_dIpE~9nr-%nG{dFh+GyO{%ZGA>t)IhM@kU>_b+%}sWN z@;oP(=VC!?+)jo4`IYBt<$1k6@AY8E7I_ZN<@w#N$}<%$I(JmBZHC3+g1vcxou<=E z$4gR?XgA1r`a_TxYe@kL54~t+$>(`m9!>D8Ki=P@&jX|X<1RP5%PsD5t1e~~I+;5K za9?Q*U^jkW4X__S`~a~;pJg7Pl~3j;<*DchGD#K0_^ntGoA+yxm-RKniy`9_qGvPh zWRJrV0*mYp)ZE<=d@t_^4i(W?xWwkyS(6O!Y+n43&~IEz==yYY-3x)4V?_{Y8f{DA zoY9iYI#L!CksitR%d3pO48A3?MK>si_ESqo#unZGFt>`WzpeivDjhjqGa@8F8Kxut zcb|(|*15s;UOlCw4~`6hnaT3i0F2%QSg{+R$88@1lbE;kWHu`Bd|r=9Or`D;f-{wL z0olo5KT-z!J+lV2eryQJjErXlP}>S>5K#WTAM*DHJ?>YSp5-1_>v3XX`ZD*pQjdcQ)A0d#`nQ80>x>uXa}?^lzreMM{Ba*I zE8dJH?&M0pjQ(*HOemRf1usmN#q-5oZmeVIs2%@xcAB)ZxQAuSOFh~QU`?u7xwA?5 zdhu;?Vrlg_4kizj{X#8t2~3$3vn@e<>EktId=~f8Gu&Ew8bpKjx!5g|RjV0D_1&i~x8xEeh8BPshz#z5O-yIur-19d`Wx&T1-CiaI3@jBJ3KHS#RJyuA0O@}#= zrOQk?f)t;-hTml$=>;29I*vF@nkF0vM`VTrL*KnJSdaC0R>BSRmGmUe#383NO`iFX z7yhA7s~ZEH+$Yr0O!;0xm6@=PKZ?XRu~=jsE%@mtzpqg(wm9DhtaWztwwnIn6*?MT z5XRiBF9U(fy_a0;yf6+Oc{ z8WtB1BshgN3C(=}mxsHui(T#M`e0F08i!BH2(!hYuE<)k^bbu;?Dt0V+_Ul;KW?sE z)KvskTbX)N`je8Dkp`>)@;OGBdR}^dvp!JEi8zCg;=;^Gr?i)O_*K zyv9$7-+K%SR^4=)e-j6|wafA_Tc#Z>`z4O!Os|Jy2zIv3875-1#w}OgMiL3~37L;*j?~<` ziq{%PRLOxLGDRmZeZ^bO0!|+>u&QEH6<%>!U+q{=b5CF9KeJR_So^U2gWeNf(W8ck zy16MK$6%)e7w2qp4F&`M==bdn;}tZVr#ETd_)RW{wI!h(3c_UJhhndZ`!@YrRx}sUyl0i&=#y*DLESWp0D-u{^Q=E+(SZ z#}=Kcy+x~KPw6oK-3@PQwT~!L#D_U4x?*LKd2+vQp`P<1b9R>d{9}4c@T(hVnH#+Y z;ac;!qFk_H;HP|KIy85xSMg3P{R$`q84^Y7r08WqhO51St~^%0lI{+Pwc#BWA4UTr zzoP@S=T6M@Q}Sr89KH;3!TEytMB@S)X=hVZARH!$D?F+yrkP)=Q6R8~$Hmz2v~f3% zV<(~11XMF-#`Bt0(n-&#OSsc?mYV`$dGW1rHUp3?(#@&J?SdYQguvxzj%z`G{$W9u zI#_hy%){`K|2~RZ^TblRnKoCM|3@nuEyYx|Fjd_$xp3}ntd3aSiVNojNxThK`;V<~ z*0y>ZyS?VR$q=-r=DEEv*unG=);6)jh`ds((>c-@G%axxVEb+Qer547{gcnA!0 z$3y(zkbAjZ$a#4|tG$z%L>9eu>%H?2g4~(?x29hf$L8?x%HSNSclt|3w_jQmL7W%yvS$Gm(#9dJ;le^2wm=A+x+l-JuM%@gvf)j+lm z5XP6wqp2e&+~}i9{#)KDZvn8vH>silf-2g`%UEIo zZ!9NsU2I@&^FT<;@tR&TDRTRFu@BNwM}DU+PLo_lCByA>PUhtU+bxh|(p_3MwWIjV z-5%UdrCX^Vvx3`JeRWB(m>jo5dbxTPFCvg=is`+%HDP={YaN@iRF6*`GVu5mCK2xQi z=5oDkw-C0bLbkoA(*3_2f>-zAunO7Bjrb$X`YB^WvHB9~y!}M4LCH5%X1*t-Dn)G0 zoc~9QeUe6nVvJe^9Zs8!^d@v#F43nP@vhb?q*t*x@~cB>rF2+*?QiehL*2AbJPood z%w_l4yPI)&`RSADxv^F%9NywsuxSLSriwo1f}>XRt$fxW-UsjMiw1!kc!r;eh?Y#; zs(UusEwyCPEKG}jH@6b^mp|%Nvfxfjwz6SZhjYbM3eah>uhh1X+Tkx!ZVXvM70b}; z2o2g4P(K|#!9byo#r7Dsr=)4II<5aSQ+=gnvUon~s7ounqI;6Yx!R_q+vSS71M2q! z_s33xrJsPM!vyWqp0W97J9?I@P0Q4#oM@h?>?&jwjJ58qkBAl>C8NRGWX5jL0Y4q- z$m!^H09wN~zOz{o-gs;BB#V+_+J3L>luAbJ@~NCT(csVhZBY*TQ&a$=?Qm!k2x zrXOS8OkH&=;81*j`}|U)g4XUM?DRTyl_?W>t4TBGia==5w5E(Zi0B|oxTN6(H7k>G zQ>VEt%EshI8<#lQg6NI@32>|F!SI;cq-RD%rUlpWHG7xQiaFwv zo^(BM{xxwL$$J?2zL<7Q5EJ^Tw*SeqToJG~0TW zE!)Q6iS^=%_5SwLC8B@9zbo6>916YUHMR#>i|qFa#Y9sr2z>$vYjalz`DpLgtz7j7 zY5r#?G6LE@rQMb`J(~p&tAa)><$9~Y*|C9eHqE8)E)-)f$Ahp`IWU)b>0k#E(sP17 z#r^wlkRlQwjP&s+&&t)f*`v4kC;uh{mh#H7gV=(=%E-zFq}|2Ek%sj`P$QL>*2$Y> zBt8}+!xx{d)bv5aFC{tb#rSCmBLGH{62FWAp$8Fd=;2HDMrc@~DNfsMP>wFpTDn3c zBz0J|R?f242cRky2eM=1TK3Hy>7@ zp;NO+k^(Msj8dkE*-r}@^#XS(QO{p9Nnin4QRQCs5>J%c*dJ??`l81rR1l8svK$?& zbTzAAA$NoB*7CG^A@j;!Vmr<2Dpo5qhpNk_y;`eYFJBbAyj*-iv#CKHUudPd4__1x za|o(8)88^H7rf4~H`gH#<7|}@f{?Jg4X2E_&iUhP3>PGAar&)aV-4J`W zF0zdZ_^m-=Kr^tvy>1zPR~*XF6cD9{Z%z$N=MTR|(j{y8xyPY!%H&Xr5@q}njTRf$ zi+Oz?%)dgN0`syhFdx<*^T)8B0lEJcn6J|ZaB`UM<}g2W3(S=ssQLi&Z(jws!NUA= zhr-yfayCMk7x%-QF(5?qgIu!r!#bL2e#aO-A(}@V=9m7vKh5{(gZa78k_sln%N0g* zr3dq~1I+Ii&1+ub=Rk)-Y6}!jdqy<(7wnIkILSh=gvPJQx%ko#i7B=oUs^mP_L6>| zlg5EukY_FYxVM`|* z6PHYgH2e_JI(HvzRD)RQq7%+Q%1x+AO`5=>HPi)X+(J)POpk#c7&3qqmcy z!H!z0hgb{7Kpsl`4TDvkp#F84T}?h>okB1l@13RDMhOC3Fx;7Tw)F*3Ebq4qzpIL+)^FKQfC1p?UdNs!0_BDUxQOqjQzY%xm%jCgN zbLIIDF)fO;dEk?%SrISTm|HuE(cyl~F z$r=Yot8#QlQVm7!#sO5a?WMW9up#lGMNW4dDR8iQKkveAz2#NKWCuk=yabVJ7 z*26zfd6Nxpv+{(EErQupR`v#~-;S!*1P+P}$`UbkOexh0)rinEG`ptFA`H6x#{*55 zUq+wos7d8b)wui@9;UJ;qf;Z>=J7CP{1W>xS|0?F&y5{72tVfgAE8jHn(#PdZOf+B zNcNaU4jOFCs)t=ohY2rgx-Ks^Z@$&ie5p8GXL&rRb^{o(UeNaSWhbk#pyFGNyNvIS zw|3)v+tOvR`X5^t$!u#3zuJzS5gU}59_7g+?M)G8B7`w)C{QFSak)W?vg`w30J7ws zc~)byFb0Ipo2=arFZI9uLN9Zv39WUK=@1Temryiyi8AfV0-wC(8=3PADRQ`LKSvGx z8W~8{Sh?RezU_|2i{+7k<}Wpdd-MOg9-LW=y^hCyg zZSSdigqy~nr1sw{53|<(WBHvq{z)K2xsg0!96K;oS)i|*XKt@Hf@$-a|2tMI%+x|m zlv?mutt!NOC-q)(KLocr**uYknv{n+*=*+IMdv=?IvA#1c)6!DNv3g-VRA+03o$8d zSeX6X@y8EcPR5|4^@Ti51VT6&Hz=hzQwB~swmjkTT-jpF72|{S*=059!#Q^JFxYaV z*m5S`?+u#^GapbQyrIJbt;AVBaw+IFeG0RP(SG|M1MYb=ydoi);1~SWxaWXkzMdxlY^Y%4cstek_eU1HLCO#1jADMm=KYJ2mM++f7YL_7Oe<$r;yrz70W| z4ejSdA(Ig|@PBleYgnspiSS^)xTNtkjl0dtoNTrijuX6!b`~rm7Y*S?GWDWe`{9qE z!nsXrV(2vS%&}q=+Q6~IzNl%rJhRw-G$5G&yaswwdP0sN&=d&s$wzw-kC*w^XrK#ImzkH1OLB_?{=jlN>=nH09qV=1OaF9_KDSVV?SIneq9+rwh+VP#^=Lq>((u@EXJmUzpgOyWi(CZM02qiXDy^2SF)N6U)&bZH`_ipeyKP7g?@C3>mDr>j)uC3i`$QU>qX{Oh>ysHr%*IMz0o+sUy-C!X0+ zrDH+cv@E6OtyA;Xt7Yk^43%tstWLKmc}<`#v73ZJkA>cv)alb}2A*DAQ}O!DrjCxO zsU4@{CHnKJsk7)5|5m4HJbe607B^nBo?Vj+6fys{y@aiGcCuGH)6C^+W{!TQ^qN3} z>nZVy7zUb1&=C@~@Vf=DoD0oi3?xcvsuE#K zK9E<)*Y-y?b3fTY%Iv}(p+;THyDO<@Gyv_`|;0C0`Hr3M3 zKCiOQQnhwn#}VoM1~ymj{|D14{s*4usM3fqx%Jst>q{nn#@sncn+;83nf~J>RTpvx zNwql=k)*oSKu3RR%K}GOcLKnVdb>M8^*SOoC#XQ{lIb?Iw2_)v8~IaqSc2He2d|eh zQ^s~yechQ?6}xtcIRaqMpiUZy+HM#0rji}H-5jK9?R!;YH?E(YukV*k&u{!yVpIMO zFU1x`Uh>DTzB7*;6xi|O0c1d#T2I7}l^%X5^9U4Z(;OR1B#j!ZHA`&WK#iuJlkdm& zplv>kB`&f0oVtdoZ&e^>oDX5}lDUvFvzMnY&P#NcP^sjms>OvM z4WXxuT_H@9pPScCuR@bPDvwO2?64976jr_T@szQvkiCVfKCs^y<1d5fmt>ydK2iCN zT54`l2XpcA*!-1bF8rCAiA+6B*Y*cJQXno`WBj;lKl~5yr0MWNjRL$v=TH|gcF|%)LAS4oC&Hyy z$9I7@@h6Mk5|(*pp8EU&k%>R$seN7Y|Buz6uH zqv~~l`RiO+H-~9H=s!`lRUg=(9?t4NQMC@(|3KCCVS_K~6ZY8q1FGH-j%u)*J~i7X zKeIcc`}iOXL9ae&^7;}GMqb16=QH(Ye5qFl%&EPL$tBSH@F&b5O*fe|oi~DH<5!wS z;-8FmD9X+dze=Dt>3zO`;nP;*vJd*x_#}PE6+s$5e;LUBI>-hU2bq|FHsIk|US4cb z?U@>l;^r^aQ~C-wAUNtmOpyv)XG) zw{Kl}A>Qvr;}V=ZP*Jcam)MmD!f*Zt8Up57oe34E*}nfh@{y+yb5!bB>xx^uE(B)m z`VqDAf0!!{vQBSqI*WCQ=hf9^GkRJ#G>Ofx)9ibo1&IRS%&kk==(;MF_=R9vzKPKE z7w&=Eb2B@sV~JY5P2blHHeSUS@z~W}@z$>!w|Sh`5pCIF?$Y{Jtc|5%E5P8=!|?@Y z&qGbA=Z|((n-|7;Ai(~Q)DlpqKU?jj_vz@0_d=CaVg7(1L7CBFG9m%6hr{`TdBlIK z)8*^hJH3Qg#lnH2%B1)i2`W}Jl=&@>@@+V5>2Kh!hdgk2iBuRICNr!Zcl#&lYdX5? z7DdgVDF1Q3W*_wTb3p6DKvCgyq=2ro0?0G-8ablUKEkE-E$97J&!~?};TNck6m!cK zISf$_$E%n%IV3ZRk%M`95VCowW)yXF%%Rq-<^EmDi0amfP`Y72k}Rk}=$3Z7?-|<(c6exLsMuRotNxQDYM|$md2r~I$xG=opjaC9wE0qb5##0AP0XRz!5UyLm7-S-oAK8ii5!(4zD+d)Om#58Bv1q*N2K<9LDZUC zo%{xi0Y-(7oUXp1n(znJiT4L$W41Tcx15RnDJ9jN9~7`za5`H4tV3&(ud^P$;Y$&9 zGIY+L46?(`;v9b(a?z6dP>~GO*G8w#@n26Fzj6w~useHQuchBl zTw}V*!kr=Ea(dg=`DJVLJNE`y8v2d+Q7`?z`=RdtH~Kxb|NnpJcj&K;el=tI($DRR z@111!8cwLnj2j1NhdK6L~$j!jBE^GLX7Rf*R<2?T^iLjG<} z&S5a>!6|#c|FH?bpw9~2rq&&9@gLl?clrljEm|Pl&)GI4j5PE1pZKGZY4_2PiH%`> z_uIzizb{0$phpQ(&{Y_}=Q|9<4rIJmx2cYx){W=mK4te>wMsgSAjUW^1)6COn@Vqe z8^L?2bs5A_uEJiD<&%TPDpOTzd2=rfsThUvp%)f$E!pJ{=}ACm%XcRvCs$>YnpX5n zGj0Mf7ga3KplU zc!_Thi6z$Sd*=ty$*IXZl%!7Gp>%TIGCb1fF}I+cZw_fV(x&Fz;g+R$>66(Wdr~0> z*t3<{1u+Ru{@iQwXxi`I{UxgN-{y0s0f!R6V)8;O%~IQxqcI#AlS6)ba;cc zo<|MB@7w_*-_$G0tP}R@e^ttTEB1To?4KKLYqX3>ZD`x+svvF7+`&IYdxzF+bi*Wq zx6r>0UCra zbVE40mgcLY`IccTglU^VmpT}#t)Yfz-QEW_v;3pPC>D!FbN`_1jo%S;E z#df|4A~M?3*wl!M)ic=}UtO5}EOpYLyf-UWU#Q38?0cd{u>}(;ro2dx*zD6@v&Pd_ z@Y4C@j;zdA+_ewh8;QPY&FJE;?N}$|1(G0+lmGbk`0Ot35x{-&i_Ncg?O&!mOO$5` z08aZ#RPK8X16!<(F!2%mT7OPKh_q95Nus#z%BF!XdqjB%tRQ^^QRpiIxDXM{XSdV9W4X`g(4k&>qsX${XL6_^ZT$G!2-*@o!!>H zKc4$Ol<#bL$n(b{m|dJX1VHq`cLO{xVS$x{El(r*TBP9s)Ez$Lsf3ey@tSYITf^&Z zOfA`FpwG(X_a^mridVYw1YY_l;p|}19sHxWZ{2O_vP|B&IcJ8tRl3yfWUGp(#K6kHT9agb> z6FM!=OOLvmT2`h2s!0!eZE8ARQe`_KSzi_FB!HRC))fYZ zIr>@6-{dtErJCw0HZ^*Y55YqbX#0#7Z6(YJIHGL#5k+%wTkR9BvILVHSBj8 z=Z967cPB*;vDI|3wo`ZYNN0}@dBk}udgx#U)K+EE|BF5+J9YU9{(`$jkLam8hDKwU zCF0+VY9Z$Jdg9Q(eV>8;A#5%Co?`>L%KsV*zJ`h9weDy{bim5 z+xu@JFf(lI0GRn^b7Zg%Pa5}UL!lx(F*IYu`UlALVAaL?8+g=a@ayhoePR`t>L6@P zxmH8**2-r;0Zm1hD2z1xz@ zg{=lgqvrsFIwb}bb5KLx?oaYRI4DLJ=$-is*?$FD{dZmAMPVO8 z(#?0X<(>ZPC9i-g{kyL`&7E?5OnJhBeMcI%O*|&eB+|&b^UzpZE4QhF#TL$xX65zG$L>FwzO@V^!hsqpAlm3`u|M_bfvRpX4T&QGX_K9d zexp;9>M(f>s#xFnH_^F-p`eWMZB)P(hYQQz_q})N=-Xijl3juGhcb6#jGH-vN`H@r z>lsS==@aS6rFXjc)2$fdSdV^Pr6m944#`QoE7C3(AL``t#N+DKqQ>Jr)EF6S+mqy} zG574wE?CW@QxBEC2UKj)+_U2Cvr7+-H+QpAe0n}B$LT}6Cs!PX7&=Bzh=a+^l^w*ezC!IaApjP?I`py4FT(z0}q9CS06*U`_fuTA6j` zn{~+!nVNjFI=Qwc`7z7NvDT?TR>dAUG+(Y+t!puzc*!;6U#i~lIXdCe>e#(nMd+wb zzO0CT)rr5e{PlcIa$S{qqg1W^keyN|)Uxt&(3I8<4bke<$m}g0N1+2Tx6KZln%b!* z^(R|XwZh&2fhn;^&dZ-#@vm6oX`ZT@FJ-IkYplE6^Wx<8gKSZ)23DwVM>on2u9kPr zYG-f-I`&9yeoe&}GcRE-eOhr%-kZ%$L-QJju=<2@u~voQ>hMyB)k@8}m3+FKKX;yXC?GoRPXL}Q+Q2;OV3u$(m=y+r z9eYW3nAhFv4jEHWlfx#&=AWz<#u|7lKpoKEx&Ox&4Vm1!rr}f;-JO$s^QPv;LzP%? zJqYkD1Pp2kH-g$$P+=6ZsWt1`-H~S5X1l!;(Ckt#byT@mf%`j8u>^9*9g<2TBsGB5 zQKh4%voU&wH}I(9MCGL^sL_aD;3c|=wVokSnH=tx@%@{{aFD$&=gRS48YT06ONvpp zH~rkxd(!JYE!F`-|1A@RVbZd=stVn1DqX_Ol-Qzer?kEqySB3<@CMkg)IXMExP@Cj zbgC&mAh~LFM(c#j7=orTooLg^abD^s>&#t;o}Fi1BKF9o^;OA@`3TBs5KE#SuGf<4%Sd`4O&t$~C@9#q#L6M!f~?R%L&4$s zem;hA<#=HBKG8{|U83^lcKCbl>CBRwcvjc1VxyU*)xxPV9O9iR0;+PqDKd67?1kf8Z22Av4d)&#Q2%VxVGNmnqYG$P)b&C&byx|M zFHn*G&L_)T-hBx7G83JdQ}NLEhc%PUFn^F;QdM=T`3(P+TgWLLtqrdbjU;#f6Qqi0 zd9daG1FT_ym96cs;5-AEM+?m`ux%XJq<2GLh05(_z<`Py)HZ|I{|W0~e5sH%>8XVpm8i`RmuyO*Dyb_!ZN(ll7TASdCoKuvm%7Qsx^p znB*IlMbQBUGiHywnBk@NFSiW84m-kR;jPJBtbUx{Br`D~kCsx7Xsd*hzf zsz71pLUnEzyMDt?qo~M=W-8*A;+);i-~L2`8GI)HRJoyknCA`oGMDKWvAUPCclfXT z1kc42S7ruCrl2ne2~Qggf$u^*^eDw5N1;`V1*72|%Lk44?8!gB<0Y03B9!`tpUHJA zy#92vqd$yxzGh@4$~MUuHV3PeP^xECE7Xu#E+E`qS6%p+jBH-T8x5CfBWDB_q*2fl2j|Wymtu8w4^b^koHomlS3Mp!`8v>)@8yb3umEFo60`6Fzjuke)(G&Wa_tdT zB$>|l6{2EbcU$uT?f9tKaAT8SSF4p_vmI#Wzf{2&9d4%{C>6}=5K2-@ufaRXp`_Z| zJ`J{fZ0jvxXCjy|0jny`?55TN<+ztR2^DvcbF;#>OWq79{;zO~7c}3=M7mmaJ~or# zowl64!W2~hl0mfblw2G4Yrp5z8@905%iDO)T+_~_0xh&IqlLWGG0J}w1#O$EE+N#G zOrcDnD^|>$(8^)%=mrYfvx4+<@er$7x>0t+PlYZ0LTi7h9&v$*d~TJZbpU$>MB3RU zUdsnYV z?^FL-M^blM`+PbvyqoX8Fj$yDXXpvDajVjjyiWeM{jz@Mf1dl3_hC?F4@0}BPj!(KaHWx z@ac+|7C#=TITTu%(3 zYRQ+*&4<*CeZkB7vW8s|^oi58PEfC&fW&01$hN3!lxe0~qFMbeGJWYwzLL8M?B)Bq zPR^XkYSc5%s0y(~O2mf}8zG%B;QQ!GQkd`5T!GZkR~Vu@`%d$Hb{oA zA2$Or z_hq$JAUfWjm7aPi24is!;PjrPk88M07Yw#9SY)iElD({?yZ}6e!*zQzq^(RWN~0c=f^l8yy>m^M&SYFuff(_lziNIOj6D~LZyT64EoM~M3x!-hL=8tdo+Vy z^?$}5PBU=*L+kfqnOtu>9|laYY~r8$OKa;3H`3NqL!!-^q)&Uq=C?Zh$wTc2&G?Dd zbp=fKnJAyA-0%$YqOpolNnhwrNpOr0fVhp@t@_T+@GUR4&t-6$aczz@_%b}~U{pp< z{wWE=_UR2^dwPFt`^n4LeDj~_vtC7}cY>9*DyH=B+oUiHR)>7kn9Y=laR zuav04Urv^4$-9XcH=7|mrX^O zup4fQNc%X|WY0H<xFNWs!N8z@}19uaWa`v_%^8 zUN#Oy8+C8RCXo?R-m>&t>FUxjZJ>iRR37cTdrkH}=zrUAbB^>z4+nO&yq z0_S5iN1Ts!WCbfpCvoW!pj%{@8KTdr{cHQ>IND2JfLApei&{Pma{bbB)y_e3y;~9? z`9fxUJ$`K`0Q%>D1;hQOSK{~U|2I;zzB1F1yR3)YHh|+fJZ8@s;;(PTU$f4@D8NW} zEWGusw_&X}_Dyf>vtGs8i$-ou=a$IRzT&(wJ6~25>589&%Nnyx-sStJ275eB{FbYy zI8zmthU{PbzkCVyea>U(hyOL=^S<$$X*Cb*u^D;gb0*ncsYwm6f^>YkgD=5TINxC@60llq@KzTAskL?X9^ZuzZpEvzqdkK!LH%tzJpH1>a69EE~O=LEMPFz6ykC^O`@-nN9f8@g^ z!>CoD27pZ^ZrJg%3;lxWCan)RR~NF`ZevK(*oC_IsW}Gm)#tR_(PWqtbiq}Np{ld% zyHGn{j(MH_j@pOJA&vW*M%u7V2hCSJYp~WoBFp64)4htdsf&j4x+(S>-Y#>Wv|nXN z;PgLeDIIS~0|(Zv>eKgHSE!e;@SVM##nxNbVdqm){`wrr?(PJ9s-gBwaMX<=)Kau9kLwE%(>C zan#zuL0e4c5iRfWp4``SS>6))eoyZC!EK^4bDq`wDoKN6OCj&OT8jC#Y)iN)CQ+ht zsRKI%F!C$oJ(mewmbZBP>JO6C2DgdIs~!BedY^2m<9%04J-?Ri3~pSu=Q*&u03*L9 z-g9Z^vb^Pbe)UJTw+6R~%7X>p_$#u!lXqP$_wk$Os4UNdDGFf1x@t%JHF@o{C5!|& zapN*-%@aH5&pv3Avi<~gXYM{dDbKCa&VJBK?VUT!bg_!_zc(Bc=;g#d7NSJG-8>9Y zkzU;Fp4Qt_^kQcAaHm^&PcK&0{a5&;cP5(Bi_2Vsr(E)K_jJEYeo&D7eo;B=tR9*8WQO$1 z>C!K!OTwUBUA08*F7;Y}%{Cwo0+{qU2dE3nJG$qaUn71=8YAk6wKENC1pc1tEUEj6 z>PgjP@k}jlvisSk9>;{t;9fxy;);3DO#X1@;Hk-Vlas#ulIHJ3@|x6Dh-o6Gyfo{8 zsTHg6zL^?3e9hG4+f&D_tx7&qlYDP|P3-;~1Vgm@Ww>;_H8uI%)NyNYJ(?PuvMzgX z)ni&{0IJg}Lk{fIDVVCWJ02vJtg92SkbJsNC~y{v8$iX1MgJWaj(o zHobX_Ay`00_J-Ub+RI}xWP##3VVpI!&oE}ep>aGSKe+8Wqyh8WPRP90t%1)?P9?`4fsYRnNhM4;;6 z99#98b98}aZEEJc!wmYcHfP)@5i5E%c}vumab{RGu_;UB)7A_&@_L&f!kBMu6Ojal z58kk5>?*<5QhQoMN@VgyQNP_1oLyRCIIH=q z0o2L~lbxvw6{EgWle)1G9;j*^cvNcmi})Ajw$%;fQe(pHrp55TtSW1BkQIxVR{h0u1S8KUDaH9{2A(O zm_-&kKO#sdy$F9IaWy7(DeCg64jgCxae(VTW!dNa%&9QOFwT3m%dpezGRR%N`>8#3 zxo=Oo%Zd-_R1Z?!e)5|5X2^8OYfthzE_ogA>HgvZObfJK;^NWR1r(;pn4u!!n1PQT z5-eE{(X~?S-^DMG zE~y3T9}HGzflZ2e%aT~zHKa>a7M~$C<$~tQZ%-FtcNGv)kh%52tqxll4=){wnmFRh zTZTd+am*i6^H*_R()ThpPK?zDnd})ZWq;sxp?y(|8+2!J$hSA3f8XnTD9TmC&Vg7VcNo4BSOZX{{uTfeAQ z8C4`T{0+`%Fw-Gc!uMU6k%va817J)cw#WzD#O`?~-X6TN_CSu|Qg*pmRA;1|!Or(q zi!Ra~{nM}1@*H-PH>PtF=CbbSQe9+0N{_i{eh_jobF9RD?8%kvgF1BPd9>|Kzu6Y& zrBT=?Yta{mGx1&JtyxE!fe-Ux(SF0??K6IchvIPqrX^>b3SoxjwR_WWPCIVUw4`@h zW{}z`$vhas!!RP~xf?`K_%<_@4(C61l68p(-DUQ>d7N0~`odQ9msKK7pZ=g0FXXK? zy>w_d6M_w7o?_k~t$0S}DKRBDz;q^R18mAPG}L3^E7#2#+>8%QeP)0%PKI?}U8n9X zMq_?itmZ!xhuFc*O=m|M$JmFi_}Kvj`G?q;-lll;@e(6~i3`!7D2C$P<-hPgJzq|J zx#6^rzDEClL>1fOe60ys$&;XUGy&jMI`e$jC1G35s39&ALv#24kx&2vNv3Lp{b8{2 z0JH<^T8^E&;%7p=_yiG;>vUbgIWRC{Z^Ib@6)|`oR}g0=*;A~42^^*;YAEv3fw4h6 zUA~O-0%^*^yao5sC+3!IvKmSy*X z>by-1QF(8KHh|9@bwq0T%Iu$k$llpA>+xeJ8ms2p#Wfk?IP4!~d(XDCM`=~VMYTZ8 zsWaH|^jKN^o7$apDGWGNEtk;pw+5KLpcnLj(!RD3>`X|u2BGt;?JVh2unwJE61$E~ zNsXtf!AHx`%C=GDda9QHV*wyO`)@jlF*gG12CY`7Rtv0MYGw)tP>u)5oD_U{zQeO5 z`-1riWl@K#tjP_MY6%kN^Y89~yxsQUI8UCxzYC|oh;-@U^sUnGL}&jXJFyYtU0DyK ziL2wT2y`Q3Id#Was|WjFhZz`a`+z&+Q*e)aoX|LL5pO!2-F!#gc9_KLv6-K63Y?s? znPah{nMR`;ZpCIU{vNmgX+HEH9ygVNs(4;ro;NP~?{kaP*Oa~1m1Aw#-y{8cQXoTUJTXM)`}pdLbw+Sdfu+Qv z%1A@6R@+f^5TG$6+O0txhtG&e&j6P1DQdu&A9^ODDb zwkBGs`%M&BgoY*;p#el~4FSz_La2kr60+wgLPP6dulvPtK*!`wo7MTZlG$Q4lhzFA z@qO}A$l@TcP-Mtt>sB&i(dDB8Z=l02Z(}u<%j%YmGF=ix+GW$VB}y)**rJ(dGhCi6 z>dqje51}ka+vnlgAAPQ_D58u?u&z(5PETa@jb`1i<&o@iVt#8WKC+3Y8!lsQ^^E46dYX=||I-jKB5x^h z1?1wNc8&?uM~<<}eeQCXU4Z}Nw;_1e$|L>{44zLDzX^TXQ=dlWJ{`Hmr;XDr`!n7` z1TE}mAn7N+KcER2qG~07JjowV^{dNKq(0ZH5KxkJN42=IuTcDpNJbhJDF>Q>PH0jz zm)hX}5_K(6*SFvOrqWR!fq{guzNa&CVk7$YGs=K#SX4@S|KEEXxl2mmmO-zkVmWg^ z_ywZsq>T=nx**hbe8CZQU6amYy4)_!68~8Qk-Jr6N*3AnXl-jk(*Okf9#mk~I-NwK zVZvgQN4GIm9HrgA<5y&qjuwTZ&q*WkpJ;Lvg1{&^n;Q*m$z7q=HpaO&0Aqv#>@^2= z>MbEKgkHq|C1Czy$`UTdvQm7Xr+zxFzFlQtUw!{wvz%?E36pjuj|hW}_P zNU8b6#(T z6si-Q!UI+PiuYW9@uUwl>?WGWLB+JVfb#w`mk8#3D4o!e<2@j-M-JpRK(cT7+3#t! z%?V%+*SHy8a)r?=n{L)wE{9UtX^EzKRE04)QfBsHkn}I8k(ld9dGu;&k4EHUi`79( z%uN70N3p-x`Ou%xgW+8tqoJ!mNu3C0pinsWs|Ex6=e0wSW?&n82yD2(ls?9$m+cJffC~-m`{531TTPxaFH|iMi{}6z|9f0{4 z@aoH7@bk`jmTy&f_xo;25IsY*pq`t;A@auQ)5rC}r-!%r^rC(8C*aSJkpUmh@5k?F zi{x7wA6(Qgk-T2P>gJaTj#elkD9vh0)n9H35LcV~iKdXur?Je#O$o3n(OK)Ud$uW& zBuX!Zp69$lJ>}~?3X>^ma1aGULTQDU&T$Yhfny>%w}z@;|INLhpp;f#9S9W~|B+1q zH73A{A~hc5q2&v)iq4roX5dgE1n4o?LY^nl9y#gp`*(Ag$?7u&h75`Riq2Uvv!H7< z%(Dn-p|3hgq2D|Ip|!NZe?8yK_5<0Ga((RqAY9u!-=ew@`@>l|^vFh+6q3>NApwM4>y0z3X})HlQ0I$_%zd#?>XeZZCjIq0 zxgzljBq)Rp5&CGuuF_?oHMWtUeL>W<7iFux9=z10ug$#&9ld|{t=#)i>jmFV52~4K zy%ofVA^+*3bsWj#E&G31`xiL5r~8i|pG|gR6WPv^L{~%&f(^l@l}gkyA!@>6T}p%! zqJ)N~vYW&u?3!KKF@}vxQHrAKk}B$wpzJ2(=9a`Qs7p~jYg~eoh_e6Z>wP{m`nP zP~FwER>*=uCI`dO(zE<NsyJT zMsBdxy06bVDy+{oQP!7b{!nXmA?skDwfV*n0H#Rq4zgAivUYk6en_vZjfGmluXj%e zfIQ@jMCOHR$5k6~hfu^_i+wB>@zJ%ezh1M^TP_b}Hl)SL4A3BLnGtWYhdGxGWrTm& zuPAJi6VoIBV6+EdXm|i9SJr39>V8Ozo!h`7?(fgTo>RT*?PVWfZ~VsVUo?>BA9?>k z0=BG>Y_e9js^OsI*gg#$o=}$LaDcJy_O2@B&1l=r;bpnkEprA& z-7?o9=2hvqak0;%8P)rz7>Yg%?@HQL-T6i+q30Ez{(g9RBaBHy`^!PLgk@{hTQ+)c zuWWw}vH=V{dXmrf+I1mxZ>mPEyrEm!_VU>d>Q$SSC)*gSZ4lYqJs{p)=R0%CpF;Ik zsNVKtHB!0}&q0&=KxOpM7wgGaY%?cm0eXN;p^jVW_r|eN7HJr5{*4CKo=jlbp996T z&8L1yGQA(!G2TSP0!`Qzkn8l6)7&aUz$^n?g*#)4Ve9!|^pbDH8B)C}KZ68_{~8sAQuUN}g;O8v0HM?j3}o6UC1O z3~i>49xvka$z$l-Gx#(i_~bE^)2E*XpFD=v=+g{7xf6U#iNA(g8myLDyr=Zzr@;`{ z+UG}`XP#+OW009{nO72%CC4G@Z0z7fUby8yWEh~dZ7^Bs@1}aSCw4@Ns|I)>#)j5@ zB48XU$`?NWACr7Yz0FHBICa;+0atDQWGlR< z)ne!>E4W~RFUX)J9^XZ`crvsBId0w9Lz4!y9?yx$+4~wrd={K3y2o&L%V~b7izlP4 zBxt6=oi1n-c2K6*s4E1GZX0`e1{;h&YbYCY@PPVrc{=+C4ZqGhsa@){l=5*(}oYn966xj-wJC*TXE<>h%iS( z`~N3|5fzNNCWa7MAa~^dX{}7=&|nh$5OpT33{fXes%t;e>;Gj?=ah}>|ATwkiwtCI z`>@kp682Y0@m^PW-#Je)2!(sCe2JxCWsg2JumhJQ25>#{Y;JWwX}qk!mKVhVAbzUp zK9=(ndYjH0r_a>*JgFehY`(@7M$riPJXa~}M1HX1hP z#iMH#^{X5C-6lA4b=|Q%^$G;CP0}=SB)5vGVYm4d9e0?CzQf&R$z7s%>n9z3Q9qgJgZ5J^P06@i ze!E`T*O4!KF@z0}M((`j$b2$R_z34xsspp#+IR7KWzT~O&BGhjhqv@0y`~efV&Y?S z%c*XKeO%TV=cD^OYqg!%ez*PCMm4?tW8mJOAXnlZgT!jxR%(wky$s+dSm)^U)3L zd{p;e96$d|3c@`R$g1d+O-~)JxU0 z@RsV>7YBd8Hd{$}K)RJdK09~?do0&>QTH{Rm!`vL`|8NbV@VJ8Z|I(Fjy2zjCJpLr;L+6x-VACgQ@$v}NvBw5 zvF2J+x9lLdwg$h}4V}OeH`peeSj$~J`d0lKbr}u58g8(Dg3sB!T2 z(tJ;jRIY5aIV>cb!4K|?gH1>lkG7x3{Lh2_=N|v_@Dm8oA`1dy#0$q){86f==nN0q zs7#AskZ0fHjoGX8PUHij9_6L>yu2Zro2-L+G|T7QmH!xjWuo7@wGWC$`1}2F#`eHg!pk{Z$0NPO~_(kaZrEhfVqMT$}t<=BoE-5LWoYw zp*)EC_XO`eD|0Um6axgqB&i|hQ<$KXz<5RFyh73 z&!OKpe%vAWdW|1A({$ss{59N2-*8+qdT-E=xS9{TOv!BdNCR0e#3L>UV3Mj-jN*u~ zeu1kn6ei5%qc6$OP?4SVEoXF>%<9Lz-3b&yHah%)PCg;Fp<`HrAd-+SFHl>gmx}eg9{}H;3JX)^O*6*4rc0uq?{3d~x=O=rvJ&tWzH` zhim3uIEWI>*VxD*+Z)Qw)>VVKZIYQiI&_Ew@qtDElw`DV(6AfKDNynk4!*l z*S$-`*JjDnS8sz}n2>%|d#Ibf)=MmPJU}V3AKKe__oZ(Ny2(t?GLk7yITUA&t*eN& z+{sfdyUK!dcE-+**KaxMOHHcTpBS9Y2g&>dz+yD2ETH%^>FdY+0*u#Ldv_p0HIY7}o(mHUt)IwrANyaHba=$ov;bBrNGA=^Zs(}m9I@E(B} zr~99i`O(>jtyHFS2urN>!5porS;Up7N7ZQy7H}Q|^QGeq(yxHjHaCh)I7HbtxPn7g zfZ%v&$4+%@A}|S0kLgl&foeLXjRrCZ?&G`Z z(RB27d+dor<4>0$9`L%!}&5MqTP&RO6+gyQ8|&HM*u@J)=Aw9rOf*ed2rS0h?Yu#e&Wn^s;+IToy^guA zh)`xo0P}-Eg!Y4O3nJ1luyDs!87S-83dRuFySAb#St3_rZACQ?6?z!MgQngUajIsR z9bZwEe}F0cmofH0LkLi^42`DX2G$A^S zBV8A5WR5E1W*eqD`sD@9b%O_jBQ*FZTEMFR6-}{@e7Eqw+NfBnT+jpc1eC30X^(Pyh-(8_* zd!9j3mWTDG!zH83tMmLTEg?c&V-fL?&oDE%tK+*7!!0g`m?|NL0YnE-daN*=jNVAq zhLwL2$S;|$gc0M5-KoqaI}aBl7R&P~Jz#};j3n(gD@eu;W&O+MI^Y9U7hG0hz6D>e zs7((_84W~s?0^CfGAu{jP5jBNbPinRF7`r>(4M|KK(;KuaL59X%E(sV5B_17xBiyk zIzm}8YF#i1P`i&q&ipM-?#!cN%5mwn9q(^8e$*09Vji`w?-6jxIsZ~|uWIur}$5ri0;VEUam?eveH)^lKDN37*by}@(FYeE`Qo9M<^T*(Eg zeZV&B$(#VCkhXmBZh_QJVpqNJJ;tQ=4V6ksYG1JGFZH?uu2NlPe1orTq{oIn}o5n^3m_%{2sH%aUCNb0OjQLIR4xq)5sWquRiuwf1>Tu=gTTo3NLpzBqg5$NGopnF+`y!Ad<_)sr&-#uPv??6wUE}y(BsDrIw?bXV_ zDGjwRNMB#p!pr~XY{tojS1GtYEGR4h^_CHA?T9;1Cdf;0EKIq={rz5gStUX3#h*iaH%IKZgL4Ig3#)vcWK^fF_ zwd?nDn!zD`e#qq6RM2jX<4_%$YFzR>{w}h;cV;M?3I3N#Alr1ycE=%>?eD#^S$VQC zVt5^5++OA$_Vr%UtH6yUxXuH7<)}b;;nVE^7D(B$Sj$|!QJq`;GaZ3T5G|sjKS?0{ z(UlqwBs;V^Sx*VEBE3;M-_T}qu^=(bD#6ejf9Vr(>rs9##jMGl)!lTW+TS%S1e~@@ zK!CICobPGG2&K5+&}ujsFnrA+Xc=6gF;jD7A^%VT-~fjmyPlfGjt+vs=d3K zD#RWBOUM`r{FmA2)SZLwKXFhG{==Fo@SnSHe*@r{*&#Rw&}X+ykkOrFG7a6%^>AMP z>rgi9&L4wpb(ZZ&+(;nj)Lz+C-aVzZsItQHE@gLfzzUUOg(?cpnCDpm^DR)raj^n0 zDBTwoXTl2Juv~pNtnkr(R6ZLna8n8`5V_RN3dfHKa53dzKLX?8VD;0zHy^C(I*Ghs zZ(P2g6c6;WAM$mcIN|&7dpNMsv65LK#2J34f-3hnr4}%9HC*Z9zJNP7RA8V8vZo4M zq^^E5jz6v9{~3kyMg5&t74&xov=3Pv{{dT_+rZo3*Wa1HrLSPO;7@6)aeHnaY1@Ly znrTlQ9lFa>krveWuKx-!$+Hu;v;cQKEHEd?eueE2!(Zb!TE9T&19JZ1xKa*O$&&f6} zOQyO0;WiNxbW=_PuZ)`9Gr~`tE)iY*;$4XNMLp+tr}e-`COS-QQbn8_nJamoS(D7* zW6H2?29M#60*wX{n;9Q_v%tUYa1IVXTJs3(esZ;O!@@7rdyX^ z1n1*|BksRwwpZm$cCqLFtNqVk)${!39>M^$GEig9Z7Kv_7&`KfYHk|le!8Mj7X{$< z+LxT!=+N6k3}FG!hbL78VFAU?5k&kAXMfju3bjLXm;nKV_g=9BNr(&4a@=_utO10&7Oi z|GShW*LB3`E6$g0c5Ld1Fxts?l;fPk=r;31(3)rE=RYwn{p+8R)pHB7Dy#xPNI<)d z9h6dP!N3w)ie3IE{x;U^C~#uUm+>O}RKqq6qk>VO0)u*WMgxF^)5IIy&l42>;7=N` z^Ma~R;xo(vtRwf)$KT-PSh2l&8XQ?VzX*tA#^Sv>>$EMIZLP-3L~L_hKiyRd8auxE z|ByM1fA)t|!)~CUPC5#MMt`WyZzr~2)*Q2~P}MSn#8Jz=qpCyOC$oK(9jUdd*(V9r&VE;z03CMq!5)RHpxt(lc?Dz| zFCN(2?G0NPfF6Zt!Guj&b2qZvx6SWv@2josY(wJ`g(qk(^1{FE(y7=(Llez!)m!BB z#2&>vkB2AP)+WmKiam7b$!%YDl+^DMG_$}i+wOb8)MVN}8tn=VcWy^XuQ%))olHGP zqYC7nh$G-R>uL5_)}Yr~qki>H2glv4Y@B~*c)U_C*;XIf!Q>`SYO|oVEUJl|vbwKt z@$;*R$*56AEcR#f-HLcAHb$A2G@NFx@|aE&do+XSaPQD*oAL4VU{t7(1Ig&v!kY_J`z$>J5sm1X*Z#n zq|~FKq@9%1Y)S5;ThL(3LS|nP{$m#_3<>-J&otSZ`U6yn#@UsqE?c_D^u$eCMT&59 zVjJ(qa>GfZ=M0j1$PBrC*UcmJn-8V%qFixhGH5MMqQX_Yji$>+@0{w%Wi5Mr5Ee`u zf+nTyN-ST6o!=u!b+_)C?|Vn6?>j50HJ>#4Z=s~^m2{>hxtIS4TC^_SgCBnmF3`f$ z1g8FoLa+_Qa#QvxaErzkqbLi~irOaii+z=6)B@wT z*bUlw|1X64YRts{^q_Ya1?VH(DBm1?RMaTs@&x}gsd*q{Ete=Sol~>bA{`F0ff2W% zFDmN4A@=iL6_lEk#?|}L-K`j;v9NdL!yoM^g3MkdOna9Nd z!$l{jd3LGdEsD|c4q*`TYEbv5?$w(h{(FH;^uW(b4LH5!p<8t@_@g?G-rF;S7nBx7 ziJ}%tOf8ri2x!?xc*)#aNpz`%pp5-xa#n-I!B|DYJlrNNz*8chX;vZAC!o5JDK0uB zIK97)p>m06lUjHOKaqx+$^&5V;h8mgF2&kl4}$C?p3Erq!qm19JP;W%WV@jpx)SSv zhas_m1EPqVmV~2L6*7IZ<;F4{s7$vcvrVl6L+yU?atYy#yKTiduB#T*o288g9XV{c z^w4JwWKNMgiq+rF@dn8_v^Q1UZ&l=gD$>AFP*z2vj^c&_-+MbMKd9-PI;ttBnj|jO zf1o3p?+Z!0G?BXyO~GiSQ%LMI+MeT2?BW%wzR09g!>RRWb3A>}GP<#tc-)7E+zCQY zJds5_H$|Tcx${&kaU%-3$w`#;^78Q zuLuU;A)8bh)%&z+fuNw(q|S=LOwz~;=4 zS;sDkHJg`|v$9&=1&UGaj|&*V@#947s-?P91b-x;X(RJ^{PP%^(Faxq#MKPfwtM&4 z%8Z;SW!v1zCNvsiTpq6$g%LR%c7;>QXpz!ua8u%(vr;U)6Yi z5X?UT)L^&c?sN*zYIw`jwlwW(81-mn@VYhmoq^}!HgXq_;?Hk=p%cTK=#0s(1wzzZ ziMrPFyrZJ=ZRT&FRoK=;?Ninhq)HF^5RFF~g}|f`Se1$Xb9;<9Q-P&OJDmcpq+lYE z*^}<)FB@_y*R3I;PTlr{jXRU|Pupi2pgV-`Z1eDh*2-=Dd9CzF(}#(E{G{g(AEV!_ z|4r4L2moEN=3SJBHLo!X+W})#`{&8Kbun#Hd4q+O$02N2?0`3!91ic)9I2~gY{#7X z%B!dx`0XYxlK3nhF*Ap$h#QUZ?fC-@zQYyr;jQ|KPi6 z2rj~>)lK=!tECYpGjh%uE$*vJru~TANM*cF1XTl-uLAtU`4(|Iu+3O(h`nTI`7L94fKrX3SrJ+B`=2F8Je{1vJ&5QZHAzDQ&2DR? zPTnVyFfbs$40xI|lfBUFJ*&dasz(SMwM;{p=nq4Y=FtK4O}^5}sx#u_N1-?QelpkD>D9noK5#aCts@752Q z-*Rrnx7w-^YqnM0Z1Zp(oSPi6Hd#}-JruimiJENsuqw_EQX1DUQtE%tA0A&QeQ1Iy zO;6@P(_229F%i1qURBqKS8iE-{?W-Pix|4jKb_Op$u#RE+&`;xgVJxN-YqG4EwS?B z^yggQzE<8@u>RH7=W4b<-DklNGwW*AkxLAnv=z(6;c(I zsw?hhvQ1gs!IwR{n+=-sK{zxeZSLEA`Dx3)N1mJN5Q~Y6X*BxYFPVJr68%U&;v1J? z96%-9^>9dN5oXpq7=r|NB0nj~-2e~3CgEv)jq+}*ywiN@#m9zf>aWx*@kT?}|IUN1m>s>x_bf~yXO)dN zwY0AI3iwr=oYXIztlv!Y@QM5oOp>{D_+*}PeY)D)l2cYDGlN&Ln_zXrT6=F#W=pZA zN(+GwrVoUG3fE87qx12iw5$*dWui0I!V;+({UAwC>0_uY=SN{wf`ked7qXvHNwEYW zSjhzlV`MueL8yua8tRNCTjBL=)38ts06$0nFp$Jl&DH!w8aCx-o>n~x z%6$FZoh#*j-4_L6fMbZLn^Z6f|nCk~I&l*L#RYb&%TWU6 zfapU7h|@HbM3z5+y%GdHAXsrYf~^WXDb`IJbdFoZ5Ey9#b%*l=|1+%dd8Gf$cXe`X zbQtdqTQ$}U-vl15Pmp6kd%j?VCo5P&qfb!yXK{x$_K(O9AGqe-J`i zDw6lu#ovdo-`=}%d|mhOcjD{Ye;K~I^phRZ{@nNB>zzT?g-mpnFSJNM1$@;rl!C9n z__TZU(+gks9?}b6TR*&UeEo{aYJthz1Ks!xd)DJW z>8Akv!?q|IZS!gK^aJpve#(&N`_+C5elYEQ=l-h^@G^>Q8tjTX1^~*;mADTkGScU6jB~M_K=5B43D6Y@m0P9P?(S`;>V!U zz!!m;Hpq;hxBDy|Un+ka!`L|aVWa2&n?!cmv@=a;kImJ!GAsb4zKX_DQJ($RE> zYW}n-Dx#5!Q-9=*m-SF!)-m906APYb+R()JSn78a<-q&fx)uyoelGAob5rPy`_1?-;-{Iq4>lyf#zIo{o4# zC>RqmsxsrMx&Nz+hFI22NALK#>{!Wt$~JMdl{_~0ZA)hNNU$UD^U1Yb zwQ@*y!o)*ZSr}Z4op$J;$RU~1cHUzx!>G~c${h8%vRrWJVVR>At*@o(%0swNo!e~q zKKAgk*u}ph@4?xFu7S8Deoxt-YA1UIhzQa{D|4gQ!d{+KTQn4Ziu4{uZty^4Pp zbn_@L1!Fx5X-XMWlGt2noV?;{)#k7Sd2+N1R_)W+GLgF9;8}|XAdvoCazh# zaP27GiTc+jb1wNZ=>K2Q{|6J&ibGYWQcuoa?E2maQ9prnXZ%~DRqD5?3d0p51bbs~ zK)OTr^EM6m)bPa^g`-!%gWfv2^ybu5%~Y!&ZW{k4o%w7+x;>A!AZU*LaPBJBl*LZ7 zs~8I)eKYTjPn~0+elSu@6uGCW<3Kfjs%I!_)ETWnG*#s06>_heLt>sZz*JX&DcRX! zhGV{)oY3KQCPy-Kxf4})P_C2slrATqeBsNsd@0sPz3qvo8bccHN0fF4c?ap=E}(-Q z#pC15-sLx&5h{<;jJN^5{0v_n{!57e{Cuz*n#|z@S8-a0xI;JkG9jN-7HfHl*UZqC z*Bj17EpfooKQ@Tg=(YW%{J}6c0p#^SyQPgaJ&-22YBQOP;1m&(lxCQ83A=hgW@Vyx z;q(>D1amX#f@fHMW$$nH+)9Y}gkG*seO*TUNOn?nb6@F3#R&pm=dVq!ZOX@tpRc|t z8ps|*{Y+(orGpB0;C!{CtPr!RQ)eQDnk@hzN$tjn`I~Pyi3~3p-$7tfS^WY;(G!Kx9jzVCojPxlu*$?uzqJ_JrGnXQRF7 zxkgM|WCIBDI0RB4h~F*bDzQt!!Y%uRL}?QWy4?{dcdk-{LS_CKN+BK6xtrDoj^9Qs z_J%Fp^A+Tu#JtKKV1@FggL{YsT6pNdPzy{yBJSBO`J?u8Sl2k1YQU&#^|{X(6Uq%& z5pSs6ACPJnc(}H6!N8`J2n{*i{ET?4_s;eMu*h(>n=b)pdm~jPv;Ma`JBJ-6$6nG- z8sV3CiBgZO<(ZdJyoeJJ+DB|jC)TnLhH~nWGQmVBluY*gz#6FD$yyDZt_%Cx$m3Nm zFV_YyQVz9!Zew5>UAshRZo*iAv=Vazslooed{arGK z_Gmn>G*UmMHnV>m6R18qZb@QW?jYDdPEABZ#lIAT?ZOAIyE6M%VgJ}ie5@ERY4&Lx z&(NK_+8uBWJoj;Jc7H?+D{3j;R`k*Ce63ACpLNt@kR5-0|X#}j`b zjL1Zr9+R0eF_*&8N3FJ_*YjEgc_ttB9|*1F|6%U++32b~`mC_;_tX{<`{Jm^+%3r*+xVsu?F&n+UHY7bv8Y1pf7!@BxHu`FKRv|Px z!Y4GVh%tPVe%)T7qNWIT)E=YXDwWaRv$O`b=76I$CS3X9H(l;IgxVcTYi_)+>c*o( zRiPL-f7Um38#!rew_Z&>%2e6)``)Ii)YKF;^)YTJ_o|+b3hJ8_Y7eHMJ=OP+QUf$s zCo`>vKez;TXKa?T*#D(gKHii+=cv(Be0z_d9BR*E3o?)f zR6a>g`giEqP`aV=b)a%PT1(%B$|NxfE~Tb^pr*d^RqgtVP*sM?xNquMpZ;!GU0PGq z)zqU({Z6XA@c~U$s;OH+xx36)wa;;(rszEJ82q7EKZ3V9uY+d`8dp|G847_B*|sjB zPz#QF6CEyz!x7v+P>h@sl|i~R?vGv3@WGNq9NCkx;1{z^bSuMqps25V|E0z2Bberj z(jPAZMZ}^9g0#LKg+{zSgCA6!hNLk6hzC%ZgVXB|Hb$K&36=h$HnfG=7J28Cbx-Wz zUO2nQDnx3*e`pG?($YpfKnu=W=5I)N)vSC`1#I;ipY5EQA{V=$KpS`#&9rHdVWgI) zyD~ZU)fr}ZP`kLY*2@6!Fd04b%>9U z`-pp^U`#06<-WF$du4lwY_7zER6Z_L333y0RcKI1JP(R=&hKFWL2qc7U#}=|W1jFD zmn$(5|MW`{-7Ls}-bQ(n0?NZLVhKU{>hwOvMD_UeM5Vo?+DnMP5{34N&5Y$eb`@$g zu0PeZ{AkcJ%xeKYX3(2S#<(f&W62^|S0g*s=-U`Qc?uj1G>l}iNW=CJ;-esf&+X9@ z$ON3neFwwX`<{Ebn*odDDR!})1^6B7E2)}(cgsiKyt8-^2X6l2gJgATp&37O1}wGV z$GDD_m`tmNd~LD60XnghrT#b_)U_3(zd6M&yuFW|m110pbC#nymNu#g_Ef~p>u0=` zn;fFIjZSxHK>3_h>cJRee=hap?(#*At&a9Zw+_d5n2J18MHi3?L8^K+E4Y0yZnpgT zTwn@hqhmhQQLs?{lY!rMrD|4wgdV+MYpz}`apeT+xi!1``cPfd;3jn=Rdc&?UHF<7 zrXiJkQZ{Ecx^MWFgxv)D>r&}E3f>I)I<+q2mi`7#=7dkwY7hFH1ZH5d$zn0gK>eZE z)J*H!)Fni3O&{7)UyX}h#EqI*Tcch#3voGUk@Zt2F|T$%_0T-AM+miLg60sQQH|vD zTGYg#%#9Y5jVh()^6ChINhSlGMCFNO=2{kcX^2^xTP-`8KZO~25E3m=bxEq{a z?+4DNUfC7}*%AW9)%$Fx?;5JjXn%c>&8xUWe75-`L)nZY>dEGwphWkX!I|>wzv4zQ z+bL^22@a5DBkMeulkdz@w(1{JtMGZ-je+X$xItcx|U(14yEEMmVzU(E1HKl(xw=7B8)m2 zUu3j@zI??1CZ}8xL{YxH}`{itr)l5@Qjc$H4ZZ(O(~d=sfZ#B>Sa`W7YX8Fc=Y zTC8MUw=7a0LkT5}7G7!SHKap&yjp+Gq_{5)v$f@J?NNivVouv+IIrP*=#P;S&!QpG zNt+WV^8R3g$YU*E7GQ9`h2u5iN{UH3 z{rp!Tcys%CFHu?UMfWJ4|6Dpx&f@W4W-aYksD0uS_*2w=q2(^$vd*WrNRToFAGAhPI8Juy zvTC}-zD&*wKquq6{Zz-U#}0cgx$Z5`UmJ8Nm^s$RzNRaW^KBXg@KMY1^Cw_V&l=BW zCl5}cQd+DML&cNn!F0UP{hmbxK2HYcN8{~P#-OV~pZegLu|5e}qz3MxoxW41QufAUt!>6Gj&QKsr^QIj` zfZ9mBSy9DgIc}#=7KQ=l%lzd|zki=fAFkdQf3b?ygTFqDRY3PsW4oc8_Lcs)WUT&H zEc+}rv7OHxaTK@DL-qHV)qGkJoBIK%Q)0uwa|iIdDmM2)aV~zP?SR7`s`P;V+-?`k z(6R*?VwcE%p~>j@D+lm+z%d5Dm_B zg6}&o`Yd)la8*Qiv(m>dW5C(u{AYEw$?(?N;oDQq@ZGdoY?oi{g2>F#4%U&oCZ+MD zxfX8v%B|CD2E1~sHU+>`>@VWjf(`w;HwUB^Rkt2BeAncHX9EUEuFHwDJ2v!X>p<+G z6{j!%Jss%i9GD%LCb%~J@`x3z2GI6yoUr|n;%!Gfojq6|c2~f}b|$I-REB+LSgFv1 z>t_KYc@dbone|^Cn{&kg@cPLz;tDn)t^f>KfA_J^yDgiM(`P;%tItEa<|+4Xt7hd! zE!TUDY|79Dk- zB+DtivRqV@1yKFh&)@!wfL+ zXTL(h@9<}f>g3EfGg4xloSC`Q{CEqdkQWkV_Xqi?#r6w+ zt3a1-ej{Xc-9IfHB)i8I$yKc8Jf9r#Da(NH)UaX6RM&tRY=-;#lv(>w#|;*jvYzps z;buI^X(knn-x{9vr^5X~2+YhM-Y5|BPR;b<++*(DS51dLb~1g}x=O(C#q>C|m>yEc zax$GyKnzG{<>^OOqV#+_L-v@B|LujuEzU`JVkTAxitUjvokeH&o1ciP#?O z*!8E(IBLoGfm_YymGiuL-G|qqjDsD&=L8^cAuR*xr2*1)P^gfu`1vY){5_HG_J76O zJO1Z@lR&$U8|>~s>w!JvqlG!lA5i^LfNF1BxPBDhNPP6n2I!R(`z6GF36;k_P$fJ~ z)Kgp-G}RoqXtdtxo3Wu*Imm|DVI#6U^cWco&>EY~LnF5OIqrQ?K7n0;(__|TdULih zQBi+l7ta?di(G&F5oa{k5EJ^5#ADpd)LFtBiX|8z{XCXhDFHTyz%olD z@5H|oX-LQ(ZMngc*uId79<7bg*&&DV)3wr#p#}P|f4C2(d=H~@*1mX(vmsZo=?+A-ZR7_Sb#7tQQRp}(o37FMLzzqA41jW|>Xb_I1lV6r2iJjOr zhw%cr!K={N<2KDc$ud(I<|C05U|HapF zyVXH_Jc-OLN24{iF=73 zs^@+#Hc^dgU#jOw?n@hxN{8EF4`qIP1N~?H58~yXX>)&kT}(WU5h>;G_nT-W43pyV zz41gj2}!o*T=3%Fm<2D-=0lr1xo7eH&I$?g4r*!Ne`$=SN3VxNGi*U_cs}VbSPTVp zo6oy{K55uNp(H{ln2)^|RCw0`p(I%REUEy-fScCqc2FB-24l9;O5*R#fbzzBCw z;&`##_U`UB(Og6b+z4tFJucTP=P#``q1lnV#v$cje1nHyuN)7NUka$?b#93`>3sv6 z%ChC3Z=)h;ZR3ZE!5SOn;EA}?`ID--Lcm7vHEY;`VvhjI=)=L#B7&nqK;E2b0e*&Ncb0Zv1NV`Vx7* zgNR#&k#+ftmw0SuJKvS<)Zdo5zm1>Nw|(jdHhtR%6vbK==tIqWFPI2k&5OofMz6oI zkHa)vJXNzqsSRf)(<#m0TQ9knY*PHAT2o-(a*ZL8vlqhd_l$Z`}^?QiJ=b7x%Y`Op3HC{Z%cDaq`kYRp})h22Ye%fnOUTKUv@k|8zvtMJOC;c$a@ z>`g%hcRp@7?B=!}_?$`b`~O-l-eo*cnVvRn&r?N`C;BUM58Yj6jCET8eB7IH|M~?` zUrEC>FjdCSWEpFdySY7l*D8@nes$&dD?zOGh@~F22|KP2jdxf+*iO+=+XhUW{LCwS zKDI`*pkvlVrcHDEa*BOqlOgYu7$?41W#oQcwxna} zez1emuT|k>c1B5Urct%mW?EHo?bzpL?V-=f^u5YKZ0wp;&3skV(0@XDa1aQ?U5LcS zyw6gtVq;D-TjwY&lWcUq)qdcz>s-_)A1ABu-MHJ~hu#7*i-Zw8@Z?TRrms}vsha(* zp>5$Z>oFOUxJ@ipRx=CCtGdn;)S4o6+^MvmBRaT7XAmaSOMt~4A(*n~RuH6fpnRpI}zDAuh=z1NWc zLF$Rt+|~tBt4^l8M#W_M^WbzZk@-T}&T$jdn$Ba@dN!Jy9vaJbh5+uvH%y~8EVrM1 zmgy&~4~peel07{LR@YK&BgY8ETJ|=hb9M!fTlhysu&Gr};p!h6*gu==YO z+RwPBuDPqvq^b7^GX(d`++5yJZdF@>8)~j|Gx^XdAC0?oi81;wp3)DXjr?s$B6g8P zy!Kj<^t5gN49r(fvta!^pVSf#bCa#?Zp$Zqc1)Cjw*Fz zKIx=hrN&s2ms0f)W?@pf_Xd~hTC1O9wc2t0%Q1Mg@&@=!4NzxNl+2nR4)_wMrL z2W_nU$YT2!d=EQ62rb9el43imEC+YY3r3WchX8`#_FYgx#Rf z-ML242M~AbHuLXnFL5pM`2hkPnQ3i<$Z~hQ&o9*;wJccs%yio1aM)nUwa&8}(qE66 ztvA;XOLV`m&*}0FgOp?MMX8ztmrFoK*&v@x4_rhi-%w&Y`sGq;%|_Sh2bkTPgf|L3 z3C2S<{0R~_i4|UsqR);lc~nxm2NP=Zl!~typXhxpQhM7DdP`|~$OSaR_y_FVnoWBr zShM&7mUSL&_Ge8kU)(w^to|E7{Au) z{TkkuiOy67rDa({52m!+MU;J`zf<|Zp@n3Dx%ZCs{m<_ms}{E5EP3W=V~k9)Y7Eo$ zWpifPcJ<4k#BleQqkXXoWyd+ZzASc;R{4oZTrV#-OJ5zV52W7ay!~Zr$dK<&Jx$xD zqpw2P*67nu4Q4hGU1={*_?KU<%6VCESGdN>PK>~xu^AX&P9@cqX%xMOry^cJsL#0RZQjD+@_Dv;L#oYnfI4( z84sFNKzNT%K)^E5E1w*!+vGIG{bF-r5+|gZv^nbqZ2zZwn%O|l3QH8K-PHv;Pg%y% zSPKCx5*xoPc2&F1g{<6mCGNlGXZWb#sVDhW-`ma;BPbLm)}j)rnsH+73yxnBJqLhG zmPF6g59r)cu{v}#fjZdEp8feWyNb{ZoP#@7OfqqUPq54NxYRrRn)P3RkNQyaPl+BZbvO( z|C5S`cmBlWJQ_PAB-u8OUg4Gc*9XE{w+G(J9`noC#fpnWKgOkEX`DYuq}yE5SN^Jg zb}4^{pRpYmTIhz46Qa+9-3$y@z&R`IBQT9}$@_Np-{AbQSS#?>kTJ1k2tZ7Rh&zdl zZoaSPo3MKVZ)n85u-YVJZ-IXxecZTy@9*UUURK}?@K<%qhi&oa@NzL zBPBp9XYt{6Opfb+kjxBCHZ8UT=+cv5|L7V0rTd>&_J#`pyN;IV=8=3>H^r`H?vT0k zH5>iXc$U8Z@;%*`@JYK08AYpLFFW~U``>uOz-{36=>W#Fta6(6h)K{wZiRo#F4UX* z153lXhm+ZbYTaGVo1JcnAqYv9xeN4RtT@!F$evT@eyvY~>=SAN0~@_USwL@{&aZ)O znlrACQY?CKd$2dR^QWQ)aY{8IR@zFbx34s2i5)=QuN8P*EYo8=V*`=+Jt2M>BYqjv zShN0d#5UHVX@}{Sq&E&I+3l_J&Z^iWpAJlYRT^vQB(FvaItiv1mhx(SFr1G?6AFRQ zPV`I5Y0{QVqsKskO*YEp6r0$J26F@dsOY!f#Rkc5T%Rd#)6;T){_s%m+n&RxV&8Vd zo`w3m(sEv@r62}+V@@p8NZ=F(*+3&-e_4sU7d?@CkkR={RR?7B1rX~z>l|?{7|((6 z(4EBeuc|H6CfkYL!-dyg%cIPcxH}m;6yh8bUY?Q5#+^e@W1#`Ji{7%)+oK^GN(H(j zf^2cY;jVhyvON%9F^5bMD-X1l>_S$)X>XxKX5qTF_Kkj3o_@f}2|H~bK<#zzz)qy) z8-|8jHUQV)krRNJ6V!N#-m=kXF97cgvUvbMr(v>1dI6~NR5mOC@aZ>!?PX>R`SyRg zbEtjuXS-*Odk^0a?yW82-d_CMdwn(UB;Nn;gK-jLR1Aj3T3T>T+Q|kaoDbZN+|GQ?f7s2clp&td`sz*NfOryB z1D3&(>s>`-^eWG*e`^M((gg~Y{VvnpHhyi!h*hLN7rI%?XF3Cd9mEtpw zz+R#|p}C~Dz{N_(>EPVQFB=gaJvM|=Y$4)b#6C1-Ozj@_v^sv1P&S)7yh(xpGQ!V; zQc!f)Ubz$mWsR zqQyDR@ChqdL#E18SzaCfQi^6Ogm!A*sLd`IV@KJ`VQSxxeMptrA)%HHz~#aWbyg?S zXp-|hp1$nzo?5fT4ZvH1Y#zY(XqehQ4J%gzQ01wtBB1tTlANXB(gp3eo*rs{Pf`0- zbAr14nEQ188)Sb{v!RtBw0#HE&|%B$|j{;X6+`$;-pwcqFCZyvBdL=g)x>9 zxLRr@P-iz|a?*#z$q+=_3ZjR>zUnoEoZ)-=ZkS>=_nGH&`N042BE(zJz^(AL4jB}x z)$si3Qse4Ld(+Pyx`KYvnThHQ{z(4N=v4Mi42-32W|R*ilCX2jTXsgbYcxjd=rqJ> zJhS={L?XF|_OeqIr*hDJtmQZ}5Nd}{Zd~{vy}{J!;xAa4HtKb>D9y3ffrcj=>wky) zK?7t?)NFmKczm+hK?h^;rqeo7Uk{j5Hue&+RYQjy^YLW%#1ej|5ws`g`x2D|(WVH4 zOAH!j>SJnsX+wExp^9?x!N2%1>p^kXL4bmy|O!rDuYEge3mywED!04{ca(1iUoiq3Y zTU{6S{Eebzx7M7X-D9VousXZCotKorjY>n2GA~Qf|0^ z)-*1#46zob{+?0VGS>>}sjo|8bJO+_n<(`)M365g^)-y52~OjJzwtLxe^!1e^jFEI z*%dkkyWu$b+`$KCuY1Y1a!N;tND5f6`T1psdD>Om%9{IRCe*sivWi-wN9Un%y8B)J zTeeNUi`-q3tmHy$frwUpy#cz}e{GL^MWlX5@k3qEr+O1GGLumSeCB40xRY{+3e3pq zTxTs!EooGLN|rQgRi48L{IYKDvFwa*boIvETdf9;SS7AL_DF6ZzXRPhXdU)6a-|Q* zEv|FDh#7{4I1jYsOD1Dv_3gpH1t%ZLf(bFxgzUq0es)DhQK%%>&at%hKje%RHYrkf z)7Pc+i~AIL&h^h{x~|KNn>4s=vaIx7Fbh0un}?%7cTviQyPY+~?2pNA267Go~=;Fe(;IjA~co0j%r= z;88)#NEztt=K*Z`swaTE76JGhKgOOPb_pARDi479QSm?lc!U59+W$6eH4RahPFZBi z_}QPLj1{kzm&zXUsCgJF8vNjDFn>e1yQ#1Gg=f`GUzLD-Zd#;EBEF`N{0?-l{0HK` zlAZUBtl$kLGv6#GZ@inl6(RCgx~`{umxG^PVfMZ?FC>%&~n^b-pK=a%etNb z9$Exon;$vRd}O=cIYSKD-}${lzFUX>SILeL(Uw+uYUMf^DP++y1YQ1{4J z|F<9aiL~+IXJOdg)=%^Vd1<4$E@(SdbHTlWcnDWj2^Rh9wvGY-SvpKVJM0~sP@SV{jD}y(pHmp>mC%j`HMtMu7@o`TR z4*loY<@eChRLzT|VFX@gy^bFFmGD$Po*(Vj299_#v-hghg#-KIbiPiDpRohp8n<9K zvQOap7vXK}qVr$poZ9&ccI0X(-CWgdwTZ~Ks~2=6ESv&*j`&Nk`c?g$IU~2szsL0s zN)ig`ip!0-^-9)!A0I(oxtrX57eL=^bZ6^IApSRB%+iG8e199B>tAPgUQ~V6zs_xi znDj7QpDc5`D;|@`Q^D6GdTN7NmgL^9hJz3OCZr8|@o$~y--+EOc{l&cN|fWR%g!8N zDeND2E08nR@|p$-&TIZ!G=PuCJS#qah}2AZyU)}7SMn^4-ou;ziBf&0cy=xmyRxve z<9~g(QZ>8lDb`|pMZibC+IfaP^6Gpb^DHhCuS^uLz&&*kKwohlj{;4Jgc{<^s5Sca zvx2sKpm6r0q+k}Xn{xPe?yvI7T7F?X~2~l)s2< z(f8(y?QMmByNWp6`m5MPvrJ6CiZrnM*`FO%1~Iw9KvrEOPH&m-5wx#6 zH<6;Um#g;wF2)Pk-abo_151XsZ7y$ z7y=RR_E^?eq*cTcv}wCzU=Z+uN)+o1tYM(sa~I|Tx7=)4*$U+?GF2qUj;rSUfXuPg zM1L+&9dvGA1tGCc#_`FwfXZ&rk{JtWr?)_T%o$3u7Sa4m8;zx@L5mZ8h~>^kA2jVx zE4h2zSk=vOa)nPB-j3Kbq!i4kIC+5)=jo9UNBd>`uts;g=VLR+feVm14P-NxamV(b z{)_-~99PYi_AtnpW6et*a=#gANpu!zC2sRg0q`yNYwFM4=_~Jz@1J{pQ>`|z8KVVOL?B`^N_!b#b%=3rona9r=@u zzVKzh@0To-R`%`m`-BmW-FTPS;!K| zAo#OD^PGIG?=5F_`9$dECSh-rG9{lfRPA*|&*R;_InB}z%%|N$DFyP5VbgDTxyrzc z>eOB1hozIfDdiWlY^`K&o26!kyiQ%In%hJkhN^Viy=G}dpX9UIR@gQElLdx8o1~^} z&Fu!j8uvJ_ouh47c|PewNAFe+BKo$_*PdtI@55ZW^RHg~ukYWJ!y*qEhaG!5SU3uJ zz``%T2(UhQsbQgkcem!(mNqV*c1NBftd>O!iu%VZD3OiM>lUJt z#iLvC_{RO^fq!B0ci3lber)R&0#27GtZ2#Vg4Hl|WZz_m%=?e}!s>T&iGtYY0X|Ie zG5BVW!)=2jUCYzubNHC5+2VHNm$@PZq@2of_wnj%ru^@^6(}?0ar?oWfjPqY;Y+yA zWzJB{l24Ok->Uzld6RLrbTNMJ+%elDRByVAEr>sQAP}_WqL76FkfE@KfxvQ(dYvKX zI%UqAa<5NGh|1NB);F;JTLXA;3{bV3z(e;jA}2oIiHe!8E>pP;uaa6aSTtHIBqb= z6{HEZAD2y8MbX?fGDIN@IaagFMo{vG%50vgH_~!{rya6_*_#VbzayV|8M}ND$}&~+ z5?zIM1U*wITBV+Fe+)nL1$tlsu9(BjZ`jJ_z8?HYeP`!$Ue8|gnfgtW>RPnUnrgRV;DIGX4y`8@kTGL5-@tr^WPl;Ga4Zk zE06ODI+EJC++KfHYJt>#gnM5zrs-2Pcl}ZP$Gs%2QuDbN!uo!hdxJGsw0Z6^KeC$1 zr2_%EJ2iio2{x8HbsgZq8}Xo8Jy+!BrfOQP#Oqf2Z7?JJzSlqeH{gBW877r9%9W}1u-M;1=-P5haE1urxr{k1+%%air=pCWn>4Ft@_#~ zHIKD6CPR{ZIGFzPO)URwNXFfuYy5#_;DCyg|ND8^qhOX({|gDtO6!3vp&rb z^edJjx+RH|G!k4n(cx`>?i2DKaBMWvVTUfoq4CQALHjiG5roPgN@>)(wwT%e7oI;HQLL14NlhC?X=4nkjQj z*_M~8X{T%GBAk+tMPg+HCWfrJBvo^(Pb8LuGEMFLbT!qZ5CMl~gRR5qOV*IEQ1rqV zbKeILJsIoR6sVKwORm*dnRnN%hB17e@@JI?#xR6yjZ%#=C-q|8BVKCi){;8 zQM`AzlmzxF)wZfZ$x(74JQ5%hrgaw(gOu;uXPtSTH}7FVfH~?OYJ)m(RQ}Xml39xO zo^PEE!?(F z0Z)Zm7l(=dz1#lsXz7b-=)#oFpIEmw2xF%y3=T6hOiY7q5wHqP)sV8BZjv1yPru4W z`52+@bJZwogY^xp%W{wU^7{Q5BneSJi-adcdR?i$&p4b22XMUH4^akt9|?D7hm7W@ zYo(@aF}Y#vq7F5dB3y_$+@QQR_}7tK!mEmMEdjoVoO`XE7}zKGI@Nu2gjM%GKS6b! z$C`llpf~1}v7uTt&z9xidp5{M#t!B zxpRxu!s#M)tXWQClZ@u&nnyCaYelhJ<%klM4EE;6-B zTp$tUNAs<*<{0H^kRi5@@~H5Gk9b2Y?$udz4`m_4=zNA#9>pHxWT&(?By~^&Vc8#f3~^cms`OA?9cBNUmomd1|$oF1lb7WSgYQ=3r>ml2qe zHd{Ul=FLXW&gbm3oPtlr2PqTtDf?PVe#k$3uEwh9UisAfdX~E(?DMf$<+E-#^t{5^ zT^rxe{8F7b~AFudvKm19NH2s>waPB-)>^ zCFU0|oJb zV-i|hm77K}+w!Wn+l_U-)toon{(r2!34B%6)%Twu7lRUSP=ZlGqecx%p9aM?QLiS5 zdeET3q2f@*f{GOtAwg7z#G3%u%hh1Db*kdj+G^`m71U}1O283tLajp`&ovG>R0ga0 ze}8MAlbj^lzR&-C`FzMd=j^rDUVE*z*Is+=$;m(^J}_O#7s_cx-R0G31AnX*=*CoJ=d^Ihaf%j;U6eiM9SS zsC+3yh%gE{ICP0WB2}J`4!E7gy9}dMO6`8(w$j8tR41o) zs5oe;Hr4H4p%D{Ra~*gx@y}-K8m<7V$+K9>vmcL(rjp&F!;`JVOSBmoCxk||Xr_{q z`l2bHcq2ZJau<$}n(B-rtZz=b@UOg96yDC?cruqS<`?MHo`0Y{>B5WN*)}IV^gRCN zzOGD)^4hG@X?*HFs}yhISR<)#$J>DfAG%L{@vA`Q)K*&^gSpmptc{Nr5P6)3Fd(ub z%=nWB)Ph0=fbvG5jC=2qqJRhv6#n&6#qj7fV-#$JcSRg6G!t*Si}YmTNf77M)um&1 zUP(Z7Wku{pKGdCodLE@BX{Oh-;3xfrl17Cz{ONwziX(FQ#s(jqWXXbkb%9lRK$vT~ zy`Rb=onV zMfB>Xg4oQrHS{pjkL)D)?>~zJh~VEoB;pxrLd<{fUQ++(&Yp{!aWo{=&L!*xkwwi# z{v3zxoNUBYG3;gkH`qFDhku0LGO=YZM!;;%@c984o*pLt-oF~y>S*6-9i;NZ$Z!GD zg16-{=t(V%{$cLLFqf6;6R33LVn;EBO`%!Z5`h4}{^+_i7 zdIMt_Z~U8J7`z8wN9|DO7UhIJ@h@MG^u!nVo5#9}1wLl}=GSDgv5@!O6?lW4w*MJ& znn_#6gG|~kRO4xbM@dHf1qS^4>mCfa0Z`-5yCk>2K!)0Acdx@v{q3(0guStEq}f@= z{qO5c*k^77OLSIA5BZLf_4yI`n$Jw*M1?WRX8SNm5Tgk7ldOTWhQScyPQL1&Tl5O= zqDukfMwPK{qwy&q)YfU?<2ZsTnW(>9oqLmQ2~AzrV#(vUfOWFI*KrQ3Ldavv(uFJG zP{pDGNUf``Pb{5Jo2@P6sFA6f3Acc4PTj8lyQc?hE4uD~+1f=V0*AUQ4C5a@ky}BY zQ*h}<{5q>g`yFl*p-s#Fj0FUmbe)9~d6`E-J-N*JEGxMBZd#!5BeQeG8&A8vL-XYakQcptmX2NbG)^7L$uGeVpt

+%@fThCyi-uerQw$m||;XlEy6R6nzbu;)o@Mxu%mJ&co->>pzG2H<`3qzd_7 zs26p^$rgqdf>E_fe*-4?ZpsfB6}tukIalJTzD0vAHUE4CuT!Q=OgSb53(4-kqEsu( z;neZz7>CUw)SY?s#mT%g*u*|Tg&0JV(pO&k<-&ZT_bTOo)oJ6@NO2PskmRaa&e7%J zckVin1nD`Fn|XSu{D%P!U?Enk$e&HC$t(mEak8LL82G~`17_ulr20H{_J`l@fT~z2 z3W8COif;oHIP2!zB}en4r{Tl-zPq;L7LCcT?4tAWreEuy!e9BBiZz=CAe9F-@lS&3 z&teipFMp9);MKts@Z29tSL}8Zc`Dd{F-i}We8 zz7@LvH?#tHv+mZP8FaDr=c(osagwEpLq6&Pd)%R@ zuwqcI%9_C*zXho$EERdlr0V@uD*H&$N8{Xf>rq%oa7a4Jyz{E65dTG)<>A&zkwKr9 z*S5+Sx=GJKb?|;b1Ep}+?ue|LY>@2lmcz=~>fobBIAgum2#C4Gm4HDOKrwBUV-Z1s zX-LGI7UEAJa5BACX!!@$9=hglC|SwtuEF}$v13Ys5`lYZYKF+_nUsq=fA%$igrRGD zWY+NPa>ApGojCN8UR=iY3opvcG?em`1aSSuRq~g}lEq$WP zQBTj=^aZLqaI#J!;%^eACLY9WHv!8%VN5kpg{j4kL_!j0GeUwl>l8FEN!4jto4UR> zQjAbYH-Z0^$`@vsSPm_+An={cbCs?+0yras1*y++Wc9Ft#+Thx^%(F?=JFoHq+!0w zC`XpLzPj@W@4+A{Uyg_t7!iv`Ya{m8r();{kL_D}^bpK0p9ptC?~yM&cOj-A)d%K^ z-vP_S`Y+g@1KJ!aUF311tB(_78MuQ@=Q})OtiL!37@h8;%8LSG73i)I3 zY>ZHy;dO`yg-W0*&0n}fLb#zk@EgA{P*MBhSsD5Bo1wUrLQh%rU(KJ=Hsg-czykYU zj6m-G9R@)K{}^#_w)bYvby(dGeP=-hpw~8*#H}yMdb4l-1Bw$5iY_>a#4^U9dRi3B z3ml9y*dEKmtGoz|4>8a+-FPSV*=g4fLvEIJZ?M{pyCoFBQ~7x^1?E!(Q%as=t{;~H z^ja1s&OpCeCgTH--o|UWc>+IK>~O3{X-o#(z}W+uM-=-={VTM5xu@+GizU~2N>nCr z{1J^?T=6)A`E6Yv+=6y~+7ngwkvDA9ySZZi*43^6@}pc#zb&ozQ_U18|9~kkY&{{q zYDRl*>4p^0B(2+!-Ki%vvHZ|KZ_gCM9QfCR@yep7Ljn0)g|w$Jt+&V_3!exuUify9 zW+S`j6hdyTXmI%Bo}F1;-HrPfuHM^)y-OXyF&CLWS9IAvx}=n6=10&W&&oR{ui}b= z-kR*r9>5v;)g^D2+j!>tn$-g(6&q%>tnohOILh`o%Ks}RZ%aDv2?iRUkLS#vW z?Gmm9)bp}Br~}~icA>t1R1O&a>GtNhE62tfeZguQo)wh*++74=8O9&i0m63GvJ7Uv zF0p{q#nOOYO0@)l0xhw>H~Osp10{=SQ-Ycw*5U>CeZ)9DxFoFQ5tSHEClXR7_o1iu zM*gq;rA`?Vq5cc}fxuF&nrME~YZbclr>~cjVOUDrk&%$(yts=Mn-&f$E|X;1X;GJ?v*3C5;=)pl|n^MV4_3p6viEjsO0I@=eEs-!E(6*G1p3M`AHms`;YPy6N4r8<0Ml-cck-weEn5G z9bL~bfa31%-MG6;(cq_{(|7AfxT?(XjHF2yNMad#!b0-*F6dOwP3ssq$OwO{+{X&BX28le z{ZZ~5hsr8=v2GuNdP^Vs=|K&S;OIf^%WjvVU+Ou3z!e8JYX2AN zQryFQR(pi#TL7lkyO>==weaDoR9QDJ>CuGoTB{E~Km60N{&g$)OF8DJ#cAdZN{1;~ z+)v@k9^J$D&Qf}TcvTeOb^4hTzXr-q*IwI_?_oCQ|K7|{K&}$*QsiI-{tcl z$|U|BT$lDtI-@(wF}hdqcIDou2=`6ZOGBaLiHpD==`BDoW&+rMUA+XXg$^V0r<6cwj_mu|KOBg`U%+dbS+)f|xY}bv#|i;}f`yGSa~g zt^U}`v&u5P3FY(%tC8tuv&jG|5E?g>gY2}vF3NXs+^C2@jjy;0cW3XKRHPOHOyGui z;ctc8$%U5q3_>ctO9*(+rm97KZeU)#M9*g{*y3$DPrjentgxuXz5H~1ZxBXn!fX1) zu2XDwqq>}yFv1;5sOm7w_JC8Mh2t1~PWeY6ZT)*#+LxjcI8*ys;*0r(1Wo{0H7#G^ z>1?5Lbjn3m7L*-w|0@tkk!1~(i$x!^nIUq6O#kxMWySZ~6W6VwmDuzyqG>U-d2`rAy~J~NY?q$!>Dqn=<{~Km zz+)k10|FeFMzTYR&GH1=s+M%)`x#cpq7*%u!NK&oZM<-@Twor`0=3}ZjLn;NBMf^u z`hABWGwe^`%n)}jOnMhyWpT1o1)MwWUYWJWAxH>@rKlzr z?wTX|R?fMW$3 zGGIOk(Oa4|?8f(%2}xdBhY2qHkZR7<5B)aabv=^?Y?S7%ZO|{LJEITjK9*)qttmWV z_Ps;X-&MV*_s}yx#=)*{HUg!Wi*A(=Ls0`h0=L z6=fSAHZtwBo|AbQAATv!RmS$WG6e?~%uI+_q6^Egte@jwo0AZ2G7|kW*tP$%LqNG; zsYibGv>RjH5Z@rH`P^}j-l7u=pwD~R(5dKc&So4j6j!l`F?N z$ot{_Apwi3uD(F2lA;&U)Xe>)u^%dg_p8DN#tM1G8S{GjsETO-liXX#c?^@^X>96O z6Egj(UzvI08fBn}jI}lmAN>=Apg{47(Xd=zJyhLWk9s@Bnw02K?d7u9sBnPYpU62u6l* zqA-U^8LqOm8mxt@E%;Ncb`HOBe9ehzM36v{*sMYXHZre&j=Pw(AGxrY`ihRm6|l|1 z$0-cOUB1|4ehNgp41Y*1k=BOildxtCAm(YMkDPM$`N)-JV6s=k+_L@dJrt86WuF@9 zwFu~rS+|GU=V5~|66{tzpXsYq&4`7jn1jE(|HAz8XMC~S2vR>L40Ir|DfZY&ibtyGyro9WL73-N!ArE%@;~C2u?RLfdoT0dH8(UDUjjF zU5bY3!$mZlT-4<)kF#Ye(AqbxE3^7?{U;0FevqX_&Tq50d?{gUX_}g?;Hk}lD8`mq zhIg#igW*#&p!wYeu2e{ys%I6TV22KB1S~PgXF73hLtn|JIR?_y{O310lv?{aquA}r zM=_vV{ZT2H;pt^b4J$*>o0932gvQpmL)gM#rIetuesGc2sh`!_s70YFhHr*|P=@O$ ztU<;YXS(Ni3wglVQlz_B`zgL#0|~bUxEG%iiB>-&k}Tg>!M!7|AGi|OqQ!)ECKF7b zbn>KFE#35pk5($-^H+1paE7dICa0+%<>v8E4)i8djHi&_Gl{&eVZ)_OYOBekphY!x zcY?THEk5~@1s^AllAuY97%B$Rf+P*n;zst1bXS|DAleIPftsaXtPU=pd^Z8#5BZe2 z)Yong-L-%$bC~ys2(-$b5%M-R0<0=A9%MfZX~krNIoiHx61~JXJOuZ8yAVULaJ=U4 zq`|B&jMoJZ2@w5Wf)^959I&hC{b8$eW?eICjbrAs+V;{-v4H#|AfowJB$iB`{34>O|S+?l%cIGMyc6#FP_dCX;NWu7L&L z+x=1*en(8B)K(_O&wmB`o2sFaT|X*8#Xe>+OgYM^WEpd!{tKy&7I!ZcjjPl@2#1 z{@gXhGvOy8Rdz+b7Kak4I|<7K1JV)5=_>Vet-iVpL%VA-o0m!-DKlRSFo@T zeBeRTyiY2BO*?@S%C!pIAP)8iudspdT((DgoHab_K)(u@Iy&P3v#!5FI`}5h-(813 zcZ5|!>5@HGFE03URLf8vGOX*&uKkixZVzKs^kJqf(cy}nC`vmmKf~e!5m{aR&_)yM z=KzmLBa@znq)NuY5)USMKJXU!Vk>(r=nx0jDGUpGNK<%P5Y zKhzYutP$b<&b09j;=%2lRw=4o4PVOf8kZJLtRo87 zce*wsPZ0rX#Ruom0AiQt+7vRzKe>2ivZ2v-&kg07fl;U#J%bXWyI86?0rV8&2*t)5DI1-!E`VVrhLr?n67(Pl9>q=&4#{Q~Q|s8tYj@cKrNQo~bt94EYq= zny70;zpyIgY))0KC1GLw{LD{7TDkC3!-rz9229p(<+)BR7M@F#XSFS<-phUc33K*x66smDcSNWv{_0 z%qQ85P3~ou?_^;+%yK%$kM){3of1oPNbI`WR?1)EfP$QaxAJPaKD|{_NINI@AmOaS ziPw-SR*uaDz9fZxl8ltr?3uLvdZ;Y;{`3b7*EC?V_U&C)`OK5|U0eeyg5}y7zB{w3 zNx&tvhfsDmmJ-4OxKm6vI;l$5+4e7#z9tzeBl@A%PiLdq+VfH%y9aJF96^3!DZr-u z4|W%01-v-8<=@jh=uJ3=zm#JD=noo{^bc?iP_q=b#KR(T-6r|@zw z=#CyM0Q4?q(xlb2o@+9oL*#qPWJZfPs;vU`~6fiYx*7dgOQT8Wez8L#f+(GD$ZFniCu!m-)q2&NBX== zWOChXLECBlr9|@bKI}Yjh+uOM@CKU?KQ$fKz6&x+dh0Kpd$%C7B@_HzOdg9_Ialsxqa8V)R5k`Zbo)D@+CU9hI1Hhgfuys`A@R(}V;6?e_|IhcwXbeO z{Y+XC606T}F-NSY+ah(`#VHq^sSKtPDPT{bet&{DOd-S-KHV>@Kf@^{Wz1;aicq(P zyp(3meVSPi9Aw69NpA~ao#?ewU$(m-|Nc{)uYaAwT7wMtqX$4Z$11q}w*LWr9d5gk zme1Kpt7Trsd%-#u(+p=2%)L|CHEv${&r5{$7c;%gB@hUp$MA4-zT|;ZzWc9WF=caR zez|RQqudso_z(;1Gu$2a$}=1TjboS7zfnPhNxfHuwdWkk|Kaw0+7T-t-z=!Q6t6lJ)z4x9Iohq`vZvZcBKgcK zufHMlir;psK+FGc@pc22mEC%qUIF=ViaLQ!!PYgtVdV$pFK5pL{auE0iK|R_`JXN6 ze3GYvh7ZzmR3|fdxzV{sMSH6dLraI}QOK*GC_IS?o4gGifX~fWEyA*su73VSz7}RT zOk!O~cX&aPiEaLPU({r=H#N=TX|TUe9;rcWLRe|_OdX3dVX=K`C3rYfn$2}Yl1iC0 zkywI|zr;d71Mupx|kq$q|AZfQ0*Nnxt&EG^VsXZ**6m!(-a}WqGe_Qj#6+5N*(`s#G4MyN zYOEA^C~E>YOqBLjOHUG;b@WahSgQxhyd0Zq<+tYaQY&28M3Kf_d-%>kG1-TTF;(JfB%GLzY1TI1u1K1bm%Pe?8bmNj;b~0 zx@eKI|LI>bC^&JD!z9-@lLP6SB^u^&^nMhiZ$JwC$G|+HAmuTF>HAlgJB-WRUE2^8 zzc~>Ih#1@BQ$jiRWAt6!vwII2)prD;=Ot-0@qhzypc0C~{ay!pV4AK*WwR7Qn8vci zX$?Byg(=1gTZ>rMpctV?Vc}RB=?L;VtGNPCM`&S2;gKOn5blhaM^_` z?8)db=7h*?SnsK19B!_of8B-)=hG%UBau}p~ zXCuHw8y%*b)}ds~G(}TdpO<@=+$(_VVg*1*CC~U)AoTI~6c;iA+yS!Z9KqevL!uR( z&Lm{?#xd`770>%By%`jo4W23c4GmgF>t#0~+gLH#%6&8YY9rD7b5+ z>Z>?^#p-&VW(kZwqZXd#Wle)STG62CoI#YXc)Q9Wk~lVi`68I);e?PKHZ<`I#>Oe? zSP=3}4nSj=2a4EG(U(fVQUrNHW&`Vlfri2E1gy>w8zAw;>0a_-%aYolTc^j}S`k#9*@6;@#bx=2pWfU*^)6ZM4`Fz+xJ!OU$RlePfU5{Gk_IIV)1OSvRT z38~zjKxNk3=tLEJks%_dU>mQ-Vc6YWUYHeOCK1A#?856o2TV_7TVcf1ag=V>iC6E? zWgnxJCH}Hsa>{nO$bS$rbw@_&xj)7Iw3}YgmJucm;!>LD%Guj0UgY9Gkktd+dVZ7g zM$*fSKg8psTNA3ys}vORjW7}x9%*lemGwocd1oumVNG%C$ zz>?x*l;pOeKq_0sYC}GnCtO~yID#S<}Eu-x;aAht`_VL zh@$*5tRx(h2!_;}a=jwJ7+`T0=HuTen8WWU(YpT@o$Je3{o?V>o{1N7m9=z*#t@@@ zu8vy=(EdL&tf60qSzuR{HEi3IB=R8^-I~Du8aq4S^Jb2Qb)ut5uwKQ~SNyySr}efZ z#gkejZG(C|_p-th?9}sj3%mQ50mpR6Ym&aX?4T&+sd#_{ox0efJz@r+;t~I=9y1pRMR4?1Y8vS!f zt|b)Es=A51D9vmjM&p0DmYIHHZK=9#EKg(Z5PURjgHn5D3|aQshm?#n0})kXib1X( zxvI}a;OPKrjszH_<3xqUX`KH@LFGlbfnsQ0M?6n41qqQqixj>Xr0jO50-n)`RE@&k z+FPUv!-ckhLdF3f+U)R}98hbN;-v*zNQMSID9>qu8ah)edO08*g3PiZNzsaQR#etD2B%>VA{Nl80U_@RTmU7G4SvNF%Y+Ak{)y@Jj-7GzkbqloE**V;IjF(#J>_S3YGB* zCQ`N_Wxr6O?QI;>mB0jG5J!OLy20VaGGRpW2$q~gLini+h49R1Mfqbq8p-4-V{#I^ zV03?xH~$qITx7H@#qr3t$#?M1AHCYR_*s4Zl9#=zx_zq4I{V%IY~w;AHz>5qHNZyj2=-3jNYK1_gGyXt z;mlYJfyAvZHwlFb`&EM3w9YLAa9VFJh5U&LX2Uf`YVt)jeWQVf5EY|znZKY&oOw%x zj5A)5zQeGIxp}-7xbGD`>28&GUoD=8;q#}#nW zDQ2ZL!gomjLH@b+WKQGNknb0(dlW+^b-j=dhmTw1(>7j)EI0vbtBf(}kf+Z~ymKDwxuzk?19cW z0P7XgQn!rT%f8hLO1(tMWQxT+#`aK03~N|6{a#xQ8YH z8vi|z(_;r92T{yQKlcz?FB!lgB762W2-ykZ1Iv1rf}+997T{`uDx$r`DNiR+MiRqA2J^o$YG<%sLX!l(;&J~N%MI{Qa-$p^ z2S8LB>Fa(VJ3v7+hUCMBGJH+r137#_nkS1Qp{V;IT3%m48YTR{8%;e-@zuU?{#t1B zOp8Y_>I~j0I~E}u*9e*?s%ZY}O8}rHU5vYNdH@aV1QQ;%3y2BO8_j}4i}7WaGL(~x zfMU`sp||qWN)E!d{@n))`0{BWN+vC)0cqF|W?_iHSEKo$EydP-&WHmLGtO`^E1k6` zH$ZL&ri!>3$A$oA;RMe&xQ=`X{_1ar4nq{K>LHuP+ES6=YzFkEnWn7NYjc9LM4l3H zWsjJV947je0tixFd651YZ14tRT?Cq#>j^MPg7q57ZeGQi%7*qYWcJH@2@A(kg)MNsQp8^xjzG#+Nfv}LIAChY8^}%cLML{L^ zGWhHBbFC8LF&itTZD5DVXSPDcw)ZAAb4Jk}2l-OHzn>Ad|aAZE#~p z#EO&>56~PB=-Yxv@I1@HXA8CuIen!R|DJ=BSr0t_VQpr3Jphu&0FwV_0+Q22tp9!h zXFx8sWF>e2bn%SY*4?S~SX625LtiZc4Xpc6;wu9?_qjZqk84Z7*m|*!4(MMuTme1=hITszQhjgPSNdjuNQhT|jNXw!|1U|5T^;z6=NFa! zE0KWSA#4xL0Dz+ml(ohok-BJ6&E6q>=|X@ircj2HF}5}+k~b|PX-!;h?x>KD z>y@yf6?#dHy2+b#p4!K;FFsoPU`LAKxB-L!NUeJqKMa6XG zpu2zQjXGdX){s5~9WWkTs(D1f0B&OgV#@bKn*Krji;U`Ic7(=;&6KZ}x_`%I4rLeSZ{T^}ca+t^!4bWBe%n$h~( zLv-RxQk3>_+)J*OajEx#otF*668gn`!mrwos~vI`M0Br|%S){icw?t#MWoKN^Eq?x zm**ld2Rho0-&J5D-g6@mAcFODWTi^=O>poGp`C-}P~8+8EPbr4c1j(T$qmkp}mIO|3rB?2VG~Z^9v!=htql z)zHAk{G@9tu>@~bU9oP|%7~kwA#eC4%?lM+Is0#NHt{~rcsQqDaXUM^%h(wor953`Exr5Ic|zr(n)3SM<8Li2_O!7xQXX%`Nh0Myr-fV0 zOr(IY9kFvBw1+TBp`S-x6r+GgPTtSF|F~&dJEZbHwC-`YW8gB8Do#XSH)ay>nYxsy z$i>F+cd(j*hqH}xuIs#G6M{LzU9v=46Ut|X1+_EO&2nAlkqmA!u;MWaIm8t{v?dzC zFViJ|{oF#wJd&dr{hCC!mFFNFvo#W*)p(q}ov}|!Zl*mg_1$e}o<%v*zO`(N1Sac9O zw&xe2>K2yV!B$W+Sr12d+@Sm=KlNKk@n0H|gdXL`3c8ngN3JB#5dLov*8!xQ$`@4C z%M5ws<@NKFk1_zo-i8n4YWPu0tmb2VaTCAD1G+V+H*<`gTVp?C9>Zi;8Hc-%5%kSh z*ZAvq6KI6&Q_3NZGikVe(?%TeS6kUke!pr|-KbHV`QiKZ@G)*TzZiN~u#|4co~}*g zexJX}xwrC6IAvaq9&NGxIiSpB3tJ`UM0W68YSusEJX6?9V&!ty4!K<=0(@xBl2SXL zO>_!3@kXAw(qP-+HDwq7B3EYV)|Owj1JR}7rb?;J%zyQ_VSjRAyIH^TJA?jYP(BIM zGACgapJqoIvLq{el^LXLd6Ee$i%v&Z2`AdmfZjq=hg_eUr#GRofZF+YHpM?OY{U{i zIm2bLHo3v1?@omWIrD_hFvMO{A?wnwpO=tqAiwiuD^2Z_6?Z=nyyM_JE1<#PYp0Qg zw$#pdn-^q@hp4QO2@R`wn^J__4|j2hdKgoy}3rZUK1G5H!Nxl@!^ zV%Jtt&}))IiP6A~;lS~aLxjS7bMo)=+K4eu{hUfFKQ}px5*JUW%pZB{LAQZ2`$?VR zOhCYQLN>oAV55sl&RA6588tQrSYF5xu3abU3;rZ^x;LmR<{*&!&9ky{emk zF57;Dqg{=8GLNsq|I8NDPI)lN2jgFVX3u!cVt~1jh2^+T^&%oGfuMGVaIEj(TakxH z80K5$PoAZoSMHt}RZ8VH(}pbNfdC#d{hBMRT0i`+a>|pGsCQj+50cT>=S; z3Jxpgon|R3$5`#C_xtNkxoGf+2-&(7pl17i!CVdB1|Mk`Z1CK+?ueKV zhWq#W*DwM|Wi=681SsPp?ynZhxP7-#aSVPE7QQ+R#;_(r4HdnfBtq)v?fFTc5!h7k z$|>jCDc*C->YY%R_Ac>=^Sz*FH0c#a5D_3pZ2fAGRRO=$nwzIyawIH`({AVP%TE(^Kd3S5__~}io3}l5OQ+-6r14_j;HT6u`acrdhEMK1NIj&s5wDrO$*YH6hek61P*QE$0ubge9J#!V}9kPN~ALotjWf^3|KzD z=z0=dJ@&seeiL%uxsrKhX*Cp(saSk$`&~Xg{P4=@iJ6^z2YjAhY0Yt8VI5VS!Sh{_ zT`_&wEX58TON2$&3$*Am(+g zi%Lhn6}hvJ+G2&UbwM(yCdi2-aPw`mkh+Dl(bXzP!p>BU)+M(dn_t!3ONxK6)x}@?EIxve>R>DzNG5jeabW~y`bbD2{ezI8+{-}Zo)G`O zlhW&*=W~LPCfxS1bv=E)TXFJyZ_bD8D_!uynxkkYciNzN4f5$7mNrBQx02Pf1$Qn4X918~- zclV~8Xf`vtT4;s7JWvSh=P%_fomkY%-Lx~|antsnN7`_ecSia?G`n|tSgf!f-gf_* z%yHF*e3nVQ0!x2W6Ef7s&z^P2#zeTGuOpd)E4PnVwiuh`7~O%I+FZNLr#DL~3U)a- zP)|c((~~%SwmtefdzHgsd{OuB@xaKQ5aOaxhTxMFc0_jiIwd^P7uGnR0R;kQ z_eUWf#RdG}Kao$LHCRtk*HGynre8GH9j}FISZmUnhQhsQOubINa!!H|0Qi(RekoV z4tR}{~o<+`Adbm`8R(P zPaP!ImyR4|3mo>4ksZcRQfdoFT%zfSp$?H}jg8YTNN93tCQ^&T zLWeTkT2o3UQu|Hb@N?revjb$D-WfcKm+^ zdVJEy68!Scb`4J06ATB>(o!iEZE@`Go8#-|Bo_0|7}CkDT1P<-M$RHoT{`c)nG>Jt zgfoCai>FOA^B@{QrXxh0d?PxukM*3J0 z*BEbdr{fs3`?#PTryuud65yT%W8{`(<|_AY=3B=xelT|Go?VC^C(!eIR(s9hEeC4q zB|WYsp|HNCd$17Tly)akhFhL)iLS#Y?)I2uLAl>Qb)`ZCPpOr>u^r*OBav@-{A+4u zxyekUV*_w-pJW7GI82Q4O7hUe`Rc+iee#9SA>3M=^VnR;x@0xjglblf9AHOb%T*gg zOE7ff28ZBSf6^4|tQAPcJrrxNNM9?PVy!nL!oBIi?~@+_2!u8;WQt##7H$z!@S0gB z?aH_$6(pMo;^&g|N+!qP7qED;-B_cl}8)gRrG;w4~ zr@(T)Om5DUkmTV!@q!447DBJ3WC_GaynXN`IZfn;XnI=g!y%D&hT`Oc(ecjnw0LI) zv!9}-1l20nT#XV<*dk*3SJihTmLutY4#AB9f~yjtLGo2iCW(q)hZ;s4H9&J?VY}fR z(FjzrH~h1_H^2&nH^5mFXgGoBsqA5pGlm;hLJ^*X9wZ_xp_sXO*Fv_)(5cCo@rQg= z&k*nu>=W}C?xe1-Im*pyRWR%3$+as(mnlchl>b_YXk2dxLA&|&K>D_bBkOR*RKu&* zPjps;IbC$&HJkdog|jR?kev(v{5z7D5``Op=|6@5Wp&jV0vp=a1O}{pnaCb#sy@N{ zJeR(y@x{j@yn8NYB+FGmy7~0r#6lpHVKgli-7$stM{^rj`yl3v5^*Hw7ph)3S|qo} zAwgMHJPm0>FDvPfE5FKmbR!sCT5onWSW1qh9!qvLF};h2u?k>;nV5FmSJ}neD;Ytt zVFvkbsnN0OBhOdIb`1tmT-87I9M3fHRf0U3>zcTY?G%Vf=zgSK-Kf;nCEMTqpQ9mQ z{dGYVN=o9r#Jdo=Yv1W)&1DRv_e0QQ;?*H}&5ms1s#P^u6o9EOUt^t%38qho(KKfs zGz7*S68O*=e$S=acDc%*yc(L#izKv%TzDOt3LSFtYfbtL#uZ|;{evbN1{}fTGES(6 z)j#gx3Z1gUIR~&1%36$L56*^V=5BW6*{()2q+;fY=uW}3Bot-h;6s(bLCgn>_wx{G zUuV$g=Zo?(k=_^E=CE42sZ0vR1>GQmrN?6ZB=mehxIk;!fQh_+QE{AN z*Qm0KC~?`0+Vz{Nb#;F(o(tcuJ?HBkg{3uUB!oA};0j|4>&KnMf3%^;{2r<4UScIE z9AOdAXChtiR(AZV4I&T6=F`AtK2|8egTUat1>52JIGkB7;vFtDx=pM3NNAU=?w^d& zA4hf=U~09G>w5O^F^KihDFPdb=|hC9umTQtb^q0I+!bGk`pSk!Sr~jRcKhrpV%g<^ z-jl>#M)IB%#dyrBp1tg=?KVR@TGolKV?n9@yw9f|muUyJ3(Iy`Sa!jPv|6D`4NQ~W zB~RwZYGN~?)yl2N%NaC%lM^EsD>KK3v6t{eES*I1??B4=$Sigr2NXnvhYJeJxmd*> zHMZfirFyy!G3Zfu5|%*r)xJCIlRXA|34O?ZtMi?n@I~?c%;Hz^)iJsicg3an(0CUl zrV6|sjN66uMdBT{tp~tXV@V4%v{sknZQZL_@Qabf8fVX|(vn)&NPM$cIMtsaE9)lb z9AK1X$1P1xHiHE}L z&Mlc08<@?yj{{11-^%#-xA~Humh}3g(;~?U@zwfkZndQ~7$a(8HJm!C01=F-_Ax``LYhZ?iF&b~$GYu<)}2 zC&Is#Eaz1Ec2D6|;1Ypj4f3{St>9NMXx>IM02IC)}n;?|%G%3H6A5$NX)h zw5&(cyO#xCN?K*E3>?+}@y{#)%Mq|;$BN^~Z*>E+;#fh0j@tQbZ)hQwAq56xEbV+& zf~MRc2mS!C8;elpQD;18yk-R$yk>GZmX2Q9(Ni{v8<9KR1=}o-xw%Y+GTa7J`MqY2Ef87GQS%&*NP3zc8!V@ppiQ#-v__EdNpDEQ= zbhQynpqNl(bri8NsN!4*#84n|`S9LQ+Yu-T-T>A7_vzc30@4I7c7j1=nYd&x=#tT| z5B5I35UW`*FQu8Xp3>yLR^`Qs52hX|#xY|$@zLB!(0~m30x`yKIWfVqKp>}Ku+vx) zAxlj~0tP(Ktf54Xdt@j21TUhhIa{}3r)yqqTwQ)W&*(iPN;~b%+|51jX%C1WT%K23 zqPY|Vq4KJ3%hZ|K26SmkSx|OJV*I@iNxW^qg1JK)oxY%-!DH{)9TLb+-Jqvx@83x| znB=&5i=UXf3Gg4rC=Kjug@C*1Q1`hM)caju?Kccd>2qnPK0qLx zLa1)St7O;1FY4A9`dBlitU(NOp|gkmWW!l{B?7yDK#b0yX}Cw>WtF_G<)d1tvd)_)3p3Ia0$aj+kr6 zebfZ)6ZmhDr9n8NfvTm+CY?Sr-`By3?x0AhPT|2E*dIx-zW}dM2LYS;k-sa0*DpW> zwBUy}B9(k40@It+dC8E9e?5m7hNW@oJNiRj6p;?owNAsgAa%x#(PH9BiFa*m+x&S$ zNACnprLT&{05_9&?JB8yw~J_lOMmpWE7XW?GGpHn?5nD^i0_Bc@tneMl_0?2J%oz- zEEjDhn#lJ9K7=AHm3dg4VIASg{VI1S;O=M3!4Tbb3T@|Pt8e+oR>OwcaM%#nO;Po8h*LiUZp6zkXM=6Dw z6z_Q^^08~6@%s7of?YAd#xY1IL5-+9K<#CHSTO0X4igvYb0%#85X~rED!QTXn|O={ z;|QcABY@oh9sEi@ZcS~moAV!GL-SOmGT$pW0uyjx@vKKXDG<>V(zDYG%*o)DqZ)*h z?m#yByu%=`8oMmbfwxM!$64m9*1eSn1(m1&hkEA{#6AxD&)9mrcszCk2_2M|L4{=b+bV?4BLoMF1t_qnbqxUs7|<+nn1?I& zJjOU8s8LJyK7ZcZD~Zb8s@Yql`ud|3tk)=gpiS6yxcvGk---}%0)_8;X}-{1Xrr{HFDKWUmIn<@+n&PqL-1 zAwFc`OFJ_f+T`kwbJ}{2^fU71%%R%vcJ-{RaCYiuBs^^#(0Cf}^uT6tSl>vLvl!}b zA|WQoU96;kbSe8dWD`Yq*WmY<+t3aGKViV2f}M(zZ-~T=8JW{>f+H@duyjd6GAv+k z&MFtoUHL}&8xv)tn!Z}8Dea2wv02S=f_9X}U7?9Qu)80iFT zdG$E<@n5PA;{?rie}9+2I>(gTUXS8y1WyFyiD(YCz0VWBY1otLjJIA>udRl9jGlXg zL{k*)1h5iCQ>f|dtI#$guB{LZ*UKt^>pwZz3eon96SOtqqSs%6%dgHmq!pqFHw_X+ zSbe{8*-jAt>J@aPiE90%EB{M6@tgbOetpwL?7ruy4=}_|-)A&AvHCKsOk_wWaQ}l( zIaW>^;F4TNfMED$Nv?`u=%ttH5_qYRps5OXLQCMyfz>A zQ^(UycJde*RPT9IyVCa0A zLhQpNgZ03D!6cC3Cg`Zhf#m>(4U$$Vu>&g*z>~X>H4O6cyWtT4M19gxku^^}_CurG z6NWpjt@5Wuk0g`A@kstQ5Y7ex{!diAL1F+#{-?SWLKkMb<7aM;#ofl~Udt6bZP-1J zyibP#@}uW`uv|p`g8>JVZi_Zquot}qMYf|iPt6xxrFh_}q!M`b40_oMS6fE4e?(wm z(v57!G;ycw+YNJFWwT7hu10$W7m3o$_vs^bxPAzmg`?jKFAU3`OF9Ur7&-d24U{CS zp#Kss_L3XML9;*(@>Ih6(OW}J3K@=xv|;wgDf~zP76mt)v1#6{OXDO;1eVIQsql}> zZw*IcXB5pNV*_&4pac_iZZZ;X+Jkkzw8BSrLc9vere&OjGv+;YL=rRNxa)TG@r>oA zKVs!Te;O&%!L?kQW#u@0>wsRl%aSDGt7<FVXye6(dxg9Y>Sn>QW-pAGudADS4Mf zCy&oS_EcIEYePUpzXmS3l1TK)Xb;+jh!sc&R^9!px!gx)RnD693Wq=(}CeTh{t<4d_yzI{d0puEi-NZ1oxxCcTC7Ud_$tORghqd2K z{u{E%5+eCP%>?WpAo#sF(2^ZM9(0gwBNaD!9laSzzU1xoOLqJ}TS*L5s+iZ;kT`av#hR zC1{$ULHM0ncu_gw#HS+vHkC`gyzE@?U$`djLOLfcu9_&|ay%xt?b}MdvcKtD?#~e@ zhQw7sR*VllU5Gq%g_;w;ZrWgmk zNNdWqn0QVqBCgnp%y>@-1DC`A?32#wcq{B_LbB5r(W0plF$wmd9s!l8_lPJiQwOVQ zUI`)Qg)30{pKVmC{hzpZ$VNrp^J106Y}}jkDwExg)lMfqa=KqF9+@43)IT+DVhd?| zT9Rk`oj9AVpEx_n)?KrSBF=BySqXvU#2AbJSTp+hBefKDZ%nP;-D=)>5Y zQ!qp#rMq>okQ6dBMT-*XM#*fTpp2;O5E+#SN2;-dL{OE;rrElFj0~XdisU!Sp@=j^ z1UW-LYG>+HPM)JE`UqFF5wxJ15bG?0Nmtt?A&&RK2EG0f{V|&CJ!=wPaD?E@{?sZz zZ1wf?e{&1l@}EFl@qnchQ%Gmnoum+6+lj3&rahsyB43ZE%^yWb`y#IO{Kd@WYvvn< zWtYyde;7ASoOT>7mnd&^zWwwbEs#Z#BC59)l?4Y{2RrBNT~>}>jFEUi$NXjpyka%| zqc$c|++E`_?RzJb*tpC@G3Nh(hD>se9_d+ZA)IpRZJCd8y>)fXzu7c<|2`4>-3?X$ zG)3F2-;7Ef6X~J8&Jqsk8Qwi{7OFo}*$&y}nX=ETt0J{x zMNzp|L9s?_Eru7T1OxxFz66uTp^&s2B3{SPD8CJl$sEWNCR62_B-o1`(~TZ8`~$bk zH(fWk+*Qr*Fbt_y?`}X3X9)Os(>n%%-QJT0U#UP|B{O{s`ljBpqkw0{Xk3;G2PS$=61 z?qM4}N837rPMy zBqrWHrj&B)7wZtb-=S`SSPdqAayMzoO*m*~25hkn&;iS|&c7K!0>6!HgTd-v_RR)T z1~BGpA>l&LQI>Me9HyOvE{Y+|Q9!#f1IavGlj1IU6ekvui@D#AxYO)D*LMiFlXpVG z;eY1Q4X(RgERtn7z(|+}5BRcRM{Gr9Z^3tyOn2LZ518zI!^PbFF5k;NC}vYXT=(a{ z<9rP@lh4qmz2A(a7daxS>}--u7n<8`&)x!Sthw_KbLt_uf4PTqVYHs_HX5&O?S zjl8TNw|j%=#ey7e&^UHKdB8DWJyMY$GU044R@4qVbzbP!}h4GKWFjlyXeO3;i-JQ3k zllKt45h&cu$-km;85u&AaJrzO!vtN63t>&X=B&TBkbR%cY1&dNik#s2SPs#Pe@x9>SabN`n|wzniT_%Oi5DVCqtPqu}OqY=4p)>ck_9!Ip=- zXdSx5WOYYp6BQSfmPr)~?tz<)`*8jLVd^WO;#h)qad&rjx8N>|y9IZL;O_43?ydm> z!5tQNch>}m00G|SzW>RdvpX}}(_UR&_0>#O8j@uB2=wL(z*gJb!m9NG(&FX2EXlPt zZp4Q{DizIxFg?6oZ_Qad7ET|fDk;_6VeD1cBLN4zU9@4WReSwHb?*{>3Ax;oHf6W@}vzlDLq$%TIR@;-BHvEbTdZKdYNJy|Yc*8jeS z(;0u-W{z?>Z-J75Xbs~*p*$|W&iD0PFPYwftB&`$UGSkj=b&BT#3s;(qtQdeuaQaL zo{%Na(9cm>Yv@dj3D?7zONUflsOrg?46<=bH41Sl>A1LWgsXRfYlmMaa7x)bO1^^}wIdWYXW ziNg`*MaG>xRt*q|D`YY50^NNGWpG_pT8#bh=D?Hc<|85Z@@eH{0`c2LQhpP+Y=~S+ z*rQ}M&d9Y)QJkw60-$jvCd!l1-kw};Mca*@xvv#(c2OX`B@-v`%D`}3o#QKUGuML^ zZR~Nyp|{+LUYM?-;g#d}6X)-)uSA`_%0eu;w3|0aQr>bHnM?>)M;Xfd*OhWfx&fbe z~`|z9J4SN9vQw?nZa{O)!~{GDtI^0X<`OJloAAMAtQ$@ zKqfbt>t}jhBoGV`q=W;vXz%Dta?ijKgidy4d#3lUWiG-4!I9#!e{sh>ealT`o)xw% z*;gCU!S>*|C3#@(K09-UzA~4{DC0Iv9NL<=XDV~;jes=9Ym!TBo9QRB5g=ib98I6p zu??r>+Qa)Dl64f7Hw<-=1UcTaRMX;kY?1088>R_&2 zg5Lf#7qzOvMbh&SqfNrH58d|YZXq2ZH3?lRiH9U&nilF5bC~KOihE76? z@)W6mtB&HcSsXb*w%Le(s)LZ7|!*f5lbs3`A7&pCfTym zg&vUoQ4htaC&<{$@kRWP#L;*qoty55lBieXtAZ^1akC(`tn(d`g3!CQh5YPhA>v38 zN-yb~#(F22hp%%CBaF@Uh$so2%?~ydttw#5sP%GEfXEUn(YtAq$GcX5&m6vBEB_$q z!o+M91;OmnR{AT_0*k$m%-YcAHZLPEj6{G{#pPhzXgp6^1P!hb>OW4hKQ;q z#!6mwg;&Dhfu~v}1)~pTTF?$f(jgUDq}-PWWpMzOLku}W^daL4K0~jr&d9Y2ILBjL z(sLNOx6PTdBSTv+Ax>9W_rk7lcI8k>&T0}=HWww8I3+JM#DNeGc|`ow4*iX|uLg~( z;|GV>gVjY{%x*HT%8v66G8rm?)EFYPIJ2+udT_!rj%bzU-vr6}!#{-+FR2KzyRrZ& zEgS&dOpqC?`)^r1+L);D0sQm+NZIsUMq&JUn8Iu=e~j%tzF_rd^%T^@X8)koN%e(D zhTY$aJ%Yz!Gzm>hf=uK050?iSUkWPAUUo)Mz}jtMjFe86SDk39BV>vviYe}^(LeSi zTV$g#;*K`c-W)Zx$(MJD()RA3KlVfzsc|l3`Qh{5n3K)Bi$-*F;enmDn>-oKw18>XcN==5kS9^BSazYgWh9 z8OPIYxl)G+jYCtu&=`y+Os0L#>d$ zpn)ozoDO~$JpY@|W5Pb&8C6VrY>|AQfWqEYgDWK2!)DO<>;bplb)j^#MZV6Bzqaw} znSMjLM7aRDfhG1ZiOBRRA57p*_u2-7wAA0Kb-jF1Fsr#%ywhVSQr~xVL5|-HV;*Md z>x0x$dF(IAgYX+LBX6S*5wG^O>q59$;~Djv@J@T{Sy%1va9Y%Hk7u2=<-yELtpUaU zh?ROpbb|7-pS1p(5CUAa0uPHubXO{oy~TyxQ_+Eo;jG1~Q+(>r3p@;NQ|o^^2F7k* zBXII(;>EfNb&(FY3e3=y6`o$i?1UQ#WiL;1*p1)5>9d!$1C6f`%X9pov;teim84df zK~5;2^t48aK(5*fAc++o%1w}3ay7c@xdi{V44TR)ml$q;QF;(w4hAvRg3`AioJE67 z!udklNv3S#2MnM!l6Qu%?HCIpR{3n=BQf8fVV>$XJv#n7=?D&*n=}}KhL6galGk%+ zRe!co(|N@m3-WcaIm>v(*rm&XCsJjqI=`QXAL@u=Z3lxv4ck4y1LDa?wFhS+-=7LQn9E;pLN;`_YI? zt!XKri^}}d4I@j^tvo$E;{siykc+IT{D?Gymbn(5$+(sQpPtJTGw$w&lKne#?tPk{ z;T7&B!Rqn(hTlxrhY6h>7@LJN@GEOX=Ns^GNQGWA*~UI>MaAK_@7+P39g8Ro2ZUD# zi}A|fT;YZS1Yv4Z4qYd1AK^+T5Njw#AqO3Uk1V32dE}TSv~7S)r!nce9;bd*J>{&4 zF3<34Rhl55ATQ#Joqi1#X7)G0*_bLZX&OeG8L=}J&3?Ef`Zp263|sFMwd80HaUw-C zKp!2Ay38CwiW7`##xqtQW(9?r{SjMVv*`!%KuXicF1C~m#tNnbu*>BhK}dTUap4bJ zBL${o7=nS0Hj?D%5S*}qK}atVkCo#jPiobpaOjzY=G4eFRTqVNKOA*Jp;;hIAwVdq zF;z{uH?kIwlz^yoXC)icH;7BJ<@J`FU-1*n#w$(k11}s^oK%kUqN>!y!ULUv(|8w{Yx^{IUiqT5K07>{bAO4p_M!{42$~p3S}G?kFc% zaNP{M=#|G`aFGKu!(5V#SE))VFwMi7+Ak5_*lA7j=nzX|pY^`p^=_p6k!Q`ik6-e% zEz~!3-cWPx6x`Szh)&Jk`U{N(ZPj9Xq`!#k@S*F;Lv4r;iNyDbcEL_SZn@i@CHKM6OEpB{&$ws4Y%+ckgPi{qjK$mb^w%uC3Z9{p2qml)4L~mk12& zcD}8}&Uys_TFJL;A*h?ib9%h@_M(Pm1(y{6#(%-xTluOf_*>fTuj_Aasli|s10Jz= zC{nTHxM3f1KgCXnDA{n4()}a5_7I_pN!)|}7LYBCqa?A5RqYa!iQw5Xf_^iNoIGIR zcHuwEUtPLx|IvA&8aJvz*?HZgYbOam<|RYS_V02PDXp&ntTprtMbcuY#-%3PHcicCS}=gs@$&3Wvp7g z0ZNFwMh<{`rWBojenbAmAKdj}(-ccTASpgzUz;$%P#l^-70N#x%45qhrfjCgqnA0V z^agxDYHopeyY;Y0EaK!zN)mdx3r^!fnXi;(5ISJ1_FJqv6zEU?YJlMg<8Vwc&T&Rneo#XAro6V?)k12uPOOWxl@-!v?11HgN@h~7TmOUA`5F@M+RMY|O#Xlu+>@pFhCbX(X4U->n z0T1}I8V;pTM&sL;r ztBREwgqrs+_XG)obtm$JPz}~hhXppjL<1?Qg>}dEq_NPs6NpY6yv4Q5f3pqt)-Pmg zb%Vt6b;%H#oG_C4$m$Z1g63Suk*}!7{2DS?2c2XxmUH5d!ArKTh?b0dq zKnA#xpM@GuT#tX}BDxOG6$BvqwCJWhhZv$+L(wJ{tt|;12kn1q3-!sGV2nCyrm=>n zvMD`SZ_CunDW&kLX3OGSVHa3`o(bIUxHXYNN|MR_m*z*^@K?TZR)*X{ z`TLluYk*8(-rrlv@K=Sn~9e!GQ zBAK%YH%TBiGApi`5+N+@STK2N{ofy`l+7@O>A2I!nE6t{v+fxE;Nvx6RNlDK)Kt^- z8#NA}WfgyzY>Mm&4xa|>qw9cI9O9M7uYAY$n?aJW%t0T39*Au>3?IqrL&RTitN%51 z;1uC;UXX{nSh{t67+3wta`gC+AIt#W{=Gk(g_-J z=AW|wv9m_%fQSY@R3-t+*B;YP|L`ZD;6LvZt~n+O4}u6sA{6FBjWCy#jpEa>ORB(c zSOE4ZH5{|Yu>*l+u#^47>A}>wL-^!!8xTXii;h`lTnbj8rsTb5$_*rb06y0=2)@dy zJzZkBglO=~7C&o=qiKCk9NpN z%RedXEC9xTgo)yi*=tE9VAvoY0Q8Rm|LwLV$)h22R@yZ&apCCpD7b%h5b`4+!@l^j zVyZhL0Mf%0S9r9N&O(LJ3h37sx|3LW-+vC!=t4Dlx3d`w{7EHL zMBazdOs2OD!|K%>nWKusl+w{l#y0SWB85v@oF66o7T7=lNj{n@;>1R*shnsv^H~UM)p4RfrMDPuh_U2{donP# z>%i!hv8mM8#1L4A43~+Utzs}rB0Q?it#X~aED@V(gv*Gi3Lwhc$YRK53+F_lsavisein5JUkT?8AAr2n_oi0 z?KD2%^^mx)XKO(XDqog1`$+aNvi?L#HIE`}<5Yodj-~38DVgVoKa?bdk)*wf!R_2*Hzu04r> zbkT(CI|3;CA{3l&Z}no8fAgD;k#abVx{v$C$b<|SowP)KCP!VV<^}j4GMa+>-7c8H zjaa#!JiqSMIy6n68Z!ceDxA>GK7GeO~6I063p$jPp*~;_oDgZT5*$W2CEiFk%Ha zVr0D6)@B0e7Q4XnH`(ytf>{@&VFPyd@S9XQd#?!b zO5_Bg?zA!adE8YrC4rOW3}j`N6n=FCX62}uIvD(c*S>QE&m)u#QPR|`m1NjvmA;|L z(roPV<1KUoX)8?s+y^$sXrofWN{<2j*Jz4zY@5FYg0AM(3oX#bWcgunbnRH`vVAqc zyl+s1QK_N2$BzDz^rSv*!a~k~9rh@mxSjMY?<#IoU?7X#$$pRl;`&EbbHV)i925wo zD(8H@;Iq#v@CvPiDC3E1&BmFYajlIa?xab0{5@NNhj9PS0 _0JS~PDV@0@ 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 literal 0 HcmV?d00001

1 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 z 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%0A<+*YU0uUjP&A9a-Y+kI7 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 y%(er`DKpRl!jaT z_wP$2zg*G*lKkaqk-Qp`9Q)Tb-*;WEmIoid%Tm=Oj*Kdym9+( z7%#jPw`5v7D_3BCyUFsK(MQOB(d6ShPoq24&yq6|4%Dc|`-V znMJ(4;=l@d0I}4l4(ew$M$T-Mhu3dzlug)(UAu?uYf8OuMym&==E;s`sq8MsNZMQS z`${jLTox{k$v$Vgq&mqzK zX^pzZnJx)C03Nla|1WpE_pSAg{^RzKB!8NuGbQ=`@dC-K;S!Gjo8z|Xlj>s5bmQ{K z+BCU9miydtH(9==t&ZDc)p0w^cJxX8wl^pFK5$m{CzAG+#C8OK{VPrTTGC#3qEI`( zzkbr;=xH$M zZ#%aN4wG*?pP{}tJzo0x{Af5B4BV>Ad9B=sQRlbn-1ZeYuo$NIUFQpp(12iVXhKkz zFUkH(p7jmNLP#1aX&m!IWGvTw-s@2r2ZN)%yu5FwYL&Nd4+fUVwCbR{i==Uq)Hk5L z!*Z)+4wH0-IxKswlFMqjy}#`-SoP%OL5|m8IBsvj<0`6ffU@_y2lCuuK6MjBS6qG71?pYJ#* z2d(KND}rBzRHyEZL?gEMuw=w6|11*xN2D$!{}sd}Sj zWq5CZJQom{q`t0)Blv-4)LVJ;qr4ZR2|f!?bC`wC-p$RH8nua5C~;}^Xm6}f2{xD#H)Z+ z@&tl+6=2j^N6S}j5|whM@PE2?Zs`cw`^$NrJdqcSR7ox}Fk}phR_q|(1TQr!qO!Hh zSJ&k~x+s%7Qq`){s=+zb@y6P(F;agm$=664*#Fx1ejmwi=a#P_9jY}Ps@bJ-Q=?2a zJ2|Znt8b!nuJQ~3=i4sx@cZSBlD|vRy^{QX`JCj{(97|=arDFQyH8v{LB53TZdiZh z>NWBojmYJ(I$6x>z4{&M1Du*WuS{5 z%xKvR=gPKOEor6fAnH}~y%(iBsT0eUlDrq?dhamDYiH9v{l}R$$)6_aEJ^&6S0^PhE1?g|-ntxXB&vc1{qunJl^l8GfMxD�FKUuHLD3sW+%Anpmhp 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 z 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%0AqKHQZGl}5g|c7V4n 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 BLMH!`E;AV(4 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