piggly 1.2.1 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +163 -0
- data/Rakefile +29 -15
- data/bin/piggly +4 -244
- data/lib/piggly.rb +19 -17
- data/lib/piggly/command.rb +9 -0
- data/lib/piggly/command/base.rb +148 -0
- data/lib/piggly/command/report.rb +162 -0
- data/lib/piggly/command/test.rb +157 -0
- data/lib/piggly/command/trace.rb +90 -0
- data/lib/piggly/command/untrace.rb +78 -0
- data/lib/piggly/compiler.rb +7 -5
- data/lib/piggly/compiler/cache_dir.rb +119 -0
- data/lib/piggly/compiler/coverage_report.rb +63 -0
- data/lib/piggly/compiler/trace_compiler.rb +105 -0
- data/lib/piggly/config.rb +47 -22
- data/lib/piggly/dumper.rb +9 -0
- data/lib/piggly/dumper/index.rb +121 -0
- data/lib/piggly/dumper/qualified_name.rb +36 -0
- data/lib/piggly/dumper/qualified_type.rb +81 -0
- data/lib/piggly/dumper/reified_procedure.rb +142 -0
- data/lib/piggly/dumper/skeleton_procedure.rb +102 -0
- data/lib/piggly/installer.rb +84 -42
- data/lib/piggly/parser.rb +43 -49
- data/lib/piggly/parser/grammar.tt +289 -313
- data/lib/piggly/parser/nodes.rb +270 -211
- data/lib/piggly/parser/traversal.rb +35 -33
- data/lib/piggly/parser/treetop_ruby19_patch.rb +1 -1
- data/lib/piggly/profile.rb +81 -60
- data/lib/piggly/reporter.rb +5 -18
- data/lib/piggly/reporter/base.rb +103 -0
- data/lib/piggly/reporter/html_dsl.rb +63 -0
- data/lib/piggly/reporter/index.rb +108 -0
- data/lib/piggly/reporter/procedure.rb +104 -0
- data/lib/piggly/reporter/resources/highlight.js +21 -0
- data/lib/piggly/reporter/{piggly.css → resources/piggly.css} +52 -12
- data/lib/piggly/reporter/{sortable.js → resources/sortable.js} +0 -0
- data/lib/piggly/tags.rb +280 -0
- data/lib/piggly/task.rb +191 -40
- data/lib/piggly/util.rb +8 -27
- data/lib/piggly/util/blankslate.rb +114 -0
- data/lib/piggly/util/cacheable.rb +19 -0
- data/lib/piggly/util/enumerable.rb +44 -0
- data/lib/piggly/util/file.rb +17 -0
- data/lib/piggly/util/process_queue.rb +96 -0
- data/lib/piggly/util/thunk.rb +39 -0
- data/lib/piggly/version.rb +8 -8
- data/spec/examples/compiler/cacheable_spec.rb +190 -0
- data/spec/examples/compiler/report_spec.rb +25 -0
- data/spec/{compiler → examples/compiler}/trace_spec.rb +7 -57
- data/spec/examples/config_spec.rb +61 -0
- data/spec/examples/dumper/index_spec.rb +197 -0
- data/spec/examples/dumper/procedure_spec.rb +116 -0
- data/spec/{grammar → examples/grammar}/expression_spec.rb +60 -60
- data/spec/{grammar → examples/grammar}/statements/assignment_spec.rb +15 -15
- data/spec/examples/grammar/statements/declaration_spec.rb +21 -0
- data/spec/{grammar → examples/grammar}/statements/exception_spec.rb +10 -10
- data/spec/{grammar → examples/grammar}/statements/if_spec.rb +47 -34
- data/spec/{grammar → examples/grammar}/statements/loop_spec.rb +5 -5
- data/spec/{grammar → examples/grammar}/statements/sql_spec.rb +11 -11
- data/spec/{grammar → examples/grammar}/tokens/comment_spec.rb +11 -11
- data/spec/{grammar → examples/grammar}/tokens/datatype_spec.rb +14 -8
- data/spec/{grammar → examples/grammar}/tokens/identifier_spec.rb +26 -10
- data/spec/{grammar → examples/grammar}/tokens/keyword_spec.rb +5 -5
- data/spec/{grammar → examples/grammar}/tokens/label_spec.rb +7 -7
- data/spec/{grammar → examples/grammar}/tokens/literal_spec.rb +1 -1
- data/spec/examples/grammar/tokens/lval_spec.rb +50 -0
- data/spec/{grammar → examples/grammar}/tokens/number_spec.rb +1 -1
- data/spec/{grammar → examples/grammar}/tokens/sqlkeywords_spec.rb +1 -1
- data/spec/{grammar → examples/grammar}/tokens/string_spec.rb +9 -9
- data/spec/{grammar → examples/grammar}/tokens/whitespace_spec.rb +1 -1
- data/spec/examples/installer_spec.rb +59 -0
- data/spec/examples/parser/nodes_spec.rb +73 -0
- data/spec/examples/parser/traversal_spec.rb +14 -0
- data/spec/examples/parser_spec.rb +115 -0
- data/spec/examples/profile_spec.rb +153 -0
- data/spec/{reporter/html_spec.rb → examples/reporter/html/dsl_spec.rb} +0 -0
- data/spec/examples/reporter/html/index_spec.rb +0 -0
- data/spec/examples/reporter/html_spec.rb +1 -0
- data/spec/examples/reporter_spec.rb +0 -0
- data/spec/{compiler → examples}/tags_spec.rb +10 -10
- data/spec/examples/task_spec.rb +0 -0
- data/spec/examples/util/cacheable_spec.rb +41 -0
- data/spec/examples/util/enumerable_spec.rb +64 -0
- data/spec/examples/util/file_spec.rb +40 -0
- data/spec/examples/util/process_queue_spec.rb +16 -0
- data/spec/examples/util/thunk_spec.rb +58 -0
- data/spec/examples/version_spec.rb +0 -0
- data/spec/issues/007_spec.rb +25 -0
- data/spec/issues/008_spec.rb +73 -0
- data/spec/issues/018_spec.rb +25 -0
- data/spec/spec_helper.rb +253 -9
- metadata +136 -93
- data/README.markdown +0 -116
- data/lib/piggly/compiler/cache.rb +0 -151
- data/lib/piggly/compiler/pretty.rb +0 -67
- data/lib/piggly/compiler/queue.rb +0 -46
- data/lib/piggly/compiler/tags.rb +0 -244
- data/lib/piggly/compiler/trace.rb +0 -91
- data/lib/piggly/filecache.rb +0 -40
- data/lib/piggly/parser/parser.rb +0 -11794
- data/lib/piggly/reporter/html.rb +0 -207
- data/spec/compiler/cache_spec.rb +0 -9
- data/spec/compiler/pretty_spec.rb +0 -9
- data/spec/compiler/queue_spec.rb +0 -3
- data/spec/compiler/rewrite_spec.rb +0 -3
- data/spec/config_spec.rb +0 -58
- data/spec/filecache_spec.rb +0 -70
- data/spec/fixtures/snippets.sql +0 -158
- data/spec/grammar/tokens/lval_spec.rb +0 -50
- data/spec/parser_spec.rb +0 -8
- data/spec/profile_spec.rb +0 -5
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
module Piggly
|
4
4
|
describe Parser, "tokens" do
|
@@ -7,43 +7,49 @@ module Piggly
|
|
7
7
|
describe "data types" do
|
8
8
|
it "can consist of a single word" do
|
9
9
|
%w[int boolean char varchar text date timestamp record].test_each do |s|
|
10
|
-
parse(:tType, s).should
|
10
|
+
parse(:tType, s).should be_datatype
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
14
|
it "can have parameterized types" do
|
15
15
|
["numeric(10,2)", "decimal(12,4)", "char(1)", "varchar(100)"].test_each do |s|
|
16
|
-
parse(:tType, s).should
|
16
|
+
parse(:tType, s).should be_datatype
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
20
|
it "can end in %ROWTYPE" do
|
21
21
|
%w[users%rowtype].test_each do |s|
|
22
|
-
parse(:tType, s).should
|
22
|
+
parse(:tType, s).should be_datatype
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
it "can have namespace notation" do
|
27
|
+
%w[public.users namespace.relation%rowtype].test_each do |s|
|
28
|
+
parse(:tType, s).should be_datatype
|
23
29
|
end
|
24
30
|
end
|
25
31
|
|
26
32
|
it "can consist of several words" do
|
27
33
|
["timestamp with time zone", "character varying"].test_each do |s|
|
28
|
-
parse(:tType, s).should
|
34
|
+
parse(:tType, s).should be_datatype
|
29
35
|
end
|
30
36
|
end
|
31
37
|
|
32
38
|
it "can specify arrays" do
|
33
39
|
["integer[]", "varchar(10)[]", "numeric(10,2)[]", "timestamp without time zone[]"].test_each do |s|
|
34
|
-
parse(:tType, s).should
|
40
|
+
parse(:tType, s).should be_datatype
|
35
41
|
end
|
36
42
|
end
|
37
43
|
|
38
44
|
it "can specify multi-dimensional" do
|
39
45
|
["integer[][]", "char(1)[][]", "character varying[][]"].test_each do |s|
|
40
|
-
parse(:tType, s).should
|
46
|
+
parse(:tType, s).should be_datatype
|
41
47
|
end
|
42
48
|
end
|
43
49
|
|
44
50
|
it "are terminated by symbol outside of parentheses" do
|
45
51
|
node, rest = parse_some(:tType, "character varying, ")
|
46
|
-
node.should
|
52
|
+
node.should be_datatype
|
47
53
|
rest.should == ', '
|
48
54
|
end
|
49
55
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
module Piggly
|
4
4
|
describe Parser, "tokens" do
|
@@ -7,50 +7,66 @@ module Piggly
|
|
7
7
|
describe "identifiers" do
|
8
8
|
it "cannot be a keyword" do
|
9
9
|
GrammarHelper::KEYWORDS.test_each do |s|
|
10
|
-
lambda{ parse(:tIdentifier, s) }.should raise_error
|
10
|
+
lambda{ parse(:tIdentifier, s); puts s }.should raise_error
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
14
|
it "can be quoted keyword" do
|
15
15
|
GrammarHelper::KEYWORDS.map{|s| '"' + s + '"' }.test_each do |s|
|
16
|
-
parse(:tIdentifier, s).should
|
16
|
+
parse(:tIdentifier, s).should be_identifier
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
20
|
it "can begin with a keyword" do
|
21
21
|
GrammarHelper::KEYWORDS.select{|s| s =~ /^[a-z]/i }.map{|s| "#{s}xyz" }.test_each do |s|
|
22
|
-
parse(:tIdentifier, s).should
|
22
|
+
parse(:tIdentifier, s).should be_identifier
|
23
23
|
end
|
24
24
|
|
25
25
|
GrammarHelper::KEYWORDS.select{|s| s =~ /^[a-z]/i }.map{|s| "#{s}_xyz" }.test_each do |s|
|
26
|
-
parse(:tIdentifier, s).should
|
26
|
+
parse(:tIdentifier, s).should be_identifier
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
30
|
it "can end with a keyword" do
|
31
31
|
GrammarHelper::KEYWORDS.select{|s| s =~ /^[a-z]/i }.map{|s| "xyz#{s}" }.test_each do |s|
|
32
|
-
parse(:tIdentifier, s).should
|
32
|
+
parse(:tIdentifier, s).should be_identifier
|
33
33
|
end
|
34
34
|
|
35
35
|
GrammarHelper::KEYWORDS.select{|s| s =~ /^[a-z]/i }.map{|s| "xyz_#{s}" }.test_each do |s|
|
36
|
-
parse(:tIdentifier, s).should
|
36
|
+
parse(:tIdentifier, s).should be_identifier
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
it "is terminated by an operator" do
|
41
|
+
GrammarHelper::KEYWORDS.select{|s| s !~ /^[a-z]/i }.test_each do |op|
|
42
|
+
node, rest = parse_some(:tIdentifier, "xyv#{op}")
|
43
|
+
node.should be_identifier
|
44
|
+
rest.should == op
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
it "is terminated by an operator" do
|
49
|
+
GrammarHelper::KEYWORDS.select{|s| s !~ /^[a-z]/i }.test_each do |op|
|
50
|
+
node, rest = parse_some(:tIdentifier, "xyv_#{op}")
|
51
|
+
node.should be_identifier
|
52
|
+
rest.should == op
|
37
53
|
end
|
38
54
|
end
|
39
55
|
|
40
56
|
it "can be one single character" do
|
41
57
|
%w[_ a b c d e f g h i j k l m n o p q r s t u v w x y z].test_each do |s|
|
42
|
-
parse(:tIdentifier, s).should
|
58
|
+
parse(:tIdentifier, s).should be_identifier
|
43
59
|
end
|
44
60
|
end
|
45
61
|
|
46
62
|
it "can contain underscores" do
|
47
63
|
%w[_abc abc_ ab_c a_bc ab_cd ab_c_d a_bc_d ab_c_d a_b_c_d a__b__c__d].test_each do |s|
|
48
|
-
parse(:tIdentifier, s).should
|
64
|
+
parse(:tIdentifier, s).should be_identifier
|
49
65
|
end
|
50
66
|
end
|
51
67
|
|
52
68
|
it "can contain numbers" do
|
53
|
-
parse(:tIdentifier, 'foo9000').should
|
69
|
+
parse(:tIdentifier, 'foo9000').should be_identifier
|
54
70
|
end
|
55
71
|
end
|
56
72
|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
module Piggly
|
4
4
|
describe Parser, "tokens" do
|
@@ -7,7 +7,7 @@ module Piggly
|
|
7
7
|
describe "keywords" do
|
8
8
|
it "parse successfully" do
|
9
9
|
GrammarHelper::KEYWORDS.test_each do |k|
|
10
|
-
parse(:keyword, k).should
|
10
|
+
parse(:keyword, k).should be_keyword
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
@@ -26,7 +26,7 @@ module Piggly
|
|
26
26
|
it "are terminated by symbols" do
|
27
27
|
GrammarHelper::KEYWORDS.test_each do |k|
|
28
28
|
node, rest = parse_some(:keyword, "#{k}+")
|
29
|
-
node.should
|
29
|
+
node.should be_keyword
|
30
30
|
rest.should == '+'
|
31
31
|
end
|
32
32
|
end
|
@@ -34,11 +34,11 @@ module Piggly
|
|
34
34
|
it "are terminated by spaces" do
|
35
35
|
GrammarHelper::KEYWORDS.test_each do |k|
|
36
36
|
node, rest = parse_some(:keyword, "#{k} ")
|
37
|
-
node.should
|
37
|
+
node.should be_keyword
|
38
38
|
rest.should == ' '
|
39
39
|
end
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
43
43
|
end
|
44
|
-
end
|
44
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
module Piggly
|
4
4
|
describe Parser, "tokens" do
|
@@ -7,34 +7,34 @@ module Piggly
|
|
7
7
|
describe "labels" do
|
8
8
|
it "must be enclosed in << and >>" do
|
9
9
|
['', 'a', 'abc', '<< a', 'a >>'].test_each do |s|
|
10
|
-
lambda{ parse(:
|
10
|
+
lambda{ parse(:tLabelDefinition, s) }.should raise_error
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
14
|
it "can have space padding" do
|
15
15
|
%w[a abc _].map{|s| "<< #{s} >>" }.test_each do |s|
|
16
|
-
parse(:
|
16
|
+
parse(:tLabelDefinition, s).should be_label
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
20
|
it "can have no space padding" do
|
21
21
|
%w[a abc _].map{|s| "<<#{s}>>" }.test_each do |s|
|
22
|
-
parse(:
|
22
|
+
parse(:tLabelDefinition, s).should be_label
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
26
|
it "cannot be multiple unquoted words" do
|
27
27
|
["<< a b >>", "<< ab cd >>"].test_each do |s|
|
28
|
-
lambda{ parse(:
|
28
|
+
lambda{ parse(:tLabelDefinition, s) }.should raise_error
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
32
|
it "can be enclosed in double quotes" do
|
33
33
|
['<< "a" >>', '<< "a b" >>', '<< "ab cd" >>'].test_each do |s|
|
34
|
-
parse(:
|
34
|
+
parse(:tLabelDefinition, s).should be_label
|
35
35
|
end
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
39
|
end
|
40
|
-
end
|
40
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Piggly
|
4
|
+
describe Parser, "tokens" do
|
5
|
+
include GrammarHelper
|
6
|
+
|
7
|
+
describe "l-values" do
|
8
|
+
it "can be a simple identifier" do
|
9
|
+
parse(:lValue, 'id').should be_a(Parser::Nodes::Assignable)
|
10
|
+
end
|
11
|
+
|
12
|
+
it "can be an attribute accessor" do
|
13
|
+
parse(:lValue, 'record.id').should be_a(Parser::Nodes::Assignable)
|
14
|
+
parse(:lValue, 'public.dataset.id').should be_a(Parser::Nodes::Assignable)
|
15
|
+
end
|
16
|
+
|
17
|
+
it "can use quoted attributes" do
|
18
|
+
parse(:lValue, 'record."ID"').should be_a(Parser::Nodes::Assignable)
|
19
|
+
parse(:lValue, '"schema name"."table name"."column name"').should be_a(Parser::Nodes::Assignable)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "can be an array accessor" do
|
23
|
+
parse(:lValue, 'names[0]').should be_a(Parser::Nodes::Assignable)
|
24
|
+
parse(:lValue, 'names[1000]').should be_a(Parser::Nodes::Assignable)
|
25
|
+
end
|
26
|
+
|
27
|
+
it "can contain comments in array accessors" do
|
28
|
+
node = parse(:lValue, 'names[3 /* comment */]')
|
29
|
+
node.should be_a(Parser::Nodes::Assignable)
|
30
|
+
node.count{|e| e.comment? }.should == 1
|
31
|
+
|
32
|
+
node = parse(:lValue, "names[9 -- comment \n]")
|
33
|
+
node.should be_a(Parser::Nodes::Assignable)
|
34
|
+
node.count{|e| e.comment? }.should == 1
|
35
|
+
end
|
36
|
+
|
37
|
+
it "can be an array accessed by another l-value" do
|
38
|
+
parse(:lValue, 'names[face.id]').should be_a(Parser::Nodes::Assignable)
|
39
|
+
end
|
40
|
+
|
41
|
+
it "can be a nested array access"
|
42
|
+
# names[faces[0].id].id doesn't work because it requires context-sensitivity [faces[0]
|
43
|
+
|
44
|
+
it "can be a multi-dimensional array access" do
|
45
|
+
parse(:lValue, 'data[10][2][0]').should be_a(Parser::Nodes::Assignable)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
module Piggly
|
4
4
|
describe Parser, "tokens" do
|
@@ -7,29 +7,29 @@ module Piggly
|
|
7
7
|
describe "strings" do
|
8
8
|
it "can be enclosed within single quotes" do
|
9
9
|
["''", "'abc'", "'abc xyz'"].test_each do |s|
|
10
|
-
parse(:tString, s).should
|
10
|
+
parse(:tString, s).should be_string
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
14
|
it "cannot be nested within single quotes" do
|
15
15
|
node, rest = parse_some(:tString, "'abc 'xyz' tuv'")
|
16
|
-
node.should
|
16
|
+
node.should be_string
|
17
17
|
rest.should == "xyz' tuv'"
|
18
18
|
|
19
19
|
node, rest = parse_some(:tString, "'can't'")
|
20
|
-
node.should
|
20
|
+
node.should be_string
|
21
21
|
rest.should == "t'"
|
22
22
|
end
|
23
23
|
|
24
24
|
it "can contain escaped single quotes" do
|
25
25
|
["''''", "'can''t'", "'abc '' xyz'"].test_each do |s|
|
26
|
-
parse(:tString, s).should
|
26
|
+
parse(:tString, s).should be_string
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
30
|
it "can be enclosed with $$ tags" do
|
31
31
|
["$$$$", "$$ abc $$", "$T$ abc $T$", "$tt$ abc $tt$"].test_each do |s|
|
32
|
-
parse(:tString, s).should
|
32
|
+
parse(:tString, s).should be_string
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
@@ -39,16 +39,16 @@ module Piggly
|
|
39
39
|
|
40
40
|
it "can embed $$ strings within single-quoted strings" do
|
41
41
|
["'ab $$ xyz $$ cd'", "'a $b$ c $b$ d'"].test_each do |s|
|
42
|
-
parse(:tString, s).should
|
42
|
+
parse(:tString, s).should be_string
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
46
46
|
it "can embed single-quote strings within $$ strings" do
|
47
47
|
["$$ 'abc' $$", "$ABC$ 'ab''cd' $ABC$"].test_each do |s|
|
48
|
-
parse(:tString, s).should
|
48
|
+
parse(:tString, s).should be_string
|
49
49
|
end
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
53
53
|
end
|
54
|
-
end
|
54
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Piggly
|
4
|
+
|
5
|
+
describe Installer do
|
6
|
+
|
7
|
+
before do
|
8
|
+
@config = Config.new
|
9
|
+
@connection = mock('connection')
|
10
|
+
@installer = Installer.new(@config, @connection)
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "trace" do
|
14
|
+
it "compiles, executes, and profiles the procedure" do
|
15
|
+
untraced = 'create or replace function x(char)'
|
16
|
+
traced = 'create or replace function f(int)'
|
17
|
+
|
18
|
+
result = {:tags => stub, :code => traced}
|
19
|
+
profile = mock('profile')
|
20
|
+
|
21
|
+
compiler = mock('compiler', :compile => result)
|
22
|
+
Compiler::TraceCompiler.should_receive(:new).
|
23
|
+
and_return(compiler)
|
24
|
+
|
25
|
+
procedure = mock('procedure', :oid => 'oid', :source => untraced)
|
26
|
+
procedure.should_receive(:definition).
|
27
|
+
with(traced).and_return(traced)
|
28
|
+
|
29
|
+
@connection.should_receive(:exec).
|
30
|
+
with(traced)
|
31
|
+
|
32
|
+
profile.should_receive(:add).
|
33
|
+
with(procedure, result[:tags], result)
|
34
|
+
|
35
|
+
@installer.trace(procedure, profile)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "untrace" do
|
40
|
+
it "executes the original definition" do
|
41
|
+
untraced = 'create or replace function x(char)'
|
42
|
+
procedure = stub(:oid => 'oid', :source => untraced)
|
43
|
+
|
44
|
+
procedure.should_receive(:definition).
|
45
|
+
and_return(untraced)
|
46
|
+
|
47
|
+
@connection.should_receive(:exec).
|
48
|
+
with(untraced)
|
49
|
+
|
50
|
+
@installer.untrace(procedure)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
describe "install_trace_support"
|
55
|
+
describe "uninstall_trace_support"
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Piggly
|
4
|
+
|
5
|
+
# load support code
|
6
|
+
Parser.parser
|
7
|
+
|
8
|
+
describe NodeClass do
|
9
|
+
describe "source_text"
|
10
|
+
describe "named?"
|
11
|
+
|
12
|
+
context "untagged node" do
|
13
|
+
describe "tagged?"
|
14
|
+
describe "tag_id"
|
15
|
+
describe "tag"
|
16
|
+
end
|
17
|
+
|
18
|
+
context "tagged node" do
|
19
|
+
describe "tagged?"
|
20
|
+
describe "tag_id"
|
21
|
+
describe "tag"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe Parser::Nodes::Expression do
|
26
|
+
describe "tag" do
|
27
|
+
context "untagged node" do
|
28
|
+
context "named :cond" do
|
29
|
+
context "with parent.while?"
|
30
|
+
context "with parent.loop?"
|
31
|
+
context "with parent.branch?"
|
32
|
+
context "with some other type of parent"
|
33
|
+
end
|
34
|
+
|
35
|
+
context "not named :cond" do
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe Parser::Nodes::Sql do
|
42
|
+
describe "tag" do
|
43
|
+
context "untagged node" do
|
44
|
+
context "named :cond" do
|
45
|
+
context "with parent.for?"
|
46
|
+
context "with some other parent"
|
47
|
+
end
|
48
|
+
|
49
|
+
context "not named :cond"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
describe Parser::Nodes::TKeyword do
|
55
|
+
describe "tag" do
|
56
|
+
context "untagged node" do
|
57
|
+
context "named :cond" do
|
58
|
+
context "with parent.loop?"
|
59
|
+
context "with some other parent"
|
60
|
+
end
|
61
|
+
|
62
|
+
context "not named :cond"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
describe Parser::Nodes::Terminal do
|
68
|
+
end
|
69
|
+
|
70
|
+
describe Parser::Nodes::NotImplemented do
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|