twowaysql 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/History.txt CHANGED
@@ -1,3 +1,9 @@
1
+ == release_0_4 / 2008-09-29
2
+ * line number support on parse error
3
+ * integrate coverage report into website
4
+ * integrate ditz to 'push-button release'
5
+ * Change ambiguous class name TwoWaySQL::Result to TwoWaySQL::MergeResult
6
+
1
7
  == release_0_3 / 2008-09-10
2
8
  * better whitespace handling
3
9
  * Whitespace compaction mode
data/Manifest.skip ADDED
@@ -0,0 +1,7 @@
1
+ ^pkg
2
+ ^doc
3
+ ^coverage
4
+ ^script
5
+ ^website
6
+ ^\.git
7
+ .*\.output
data/Manifest.txt CHANGED
@@ -1,5 +1,6 @@
1
1
  History.txt
2
2
  License.txt
3
+ Manifest.skip
3
4
  Manifest.txt
4
5
  README.txt
5
6
  Rakefile
@@ -10,6 +11,7 @@ issues/issue-1cee7e821865a216674832b0186bd92792680571.yaml
10
11
  issues/issue-25efcfc383f3b0f6c0e2730ae7c2975bb2b3de26.yaml
11
12
  issues/issue-279105dd0d9f03514d318f5eab5e99c4c2d47fda.yaml
12
13
  issues/issue-28cde89ed3eb306957edc90595b1d16bf43daf42.yaml
14
+ issues/issue-2a172da16d3a59adc8448f2e36ec48b36951e02d.yaml
13
15
  issues/issue-39023ea09e17e2d64bcef03aa59cdfe38b78ad5b.yaml
14
16
  issues/issue-4bc308d55ae91f266e656162a4147d356de1166c.yaml
15
17
  issues/issue-5c973ef5bb074eacca0c6c84f7d27c4267773ea8.yaml
@@ -17,6 +19,7 @@ issues/issue-664986b219202ff1948cab717b56e7540f493561.yaml
17
19
  issues/issue-6daccddf089d11d42bf016897da98f70cf5ab46c.yaml
18
20
  issues/issue-897995fa10377eabdf597e8e7692f17087c76923.yaml
19
21
  issues/issue-901f65630639507c8b05b466790e9f22256c6450.yaml
22
+ issues/issue-a185b4247f64c1104bc49ebf823b57b5de3d06f8.yaml
20
23
  issues/issue-bd38c1cdc965d73dd629a81db2de1bcdcf4b10b8.yaml
21
24
  issues/issue-dca4b19aa13de59838b33e03252bf824670a2d12.yaml
22
25
  issues/issue-f1bd40de5458397d9b142ea3e197e5264e0dcdbf.yaml
@@ -30,10 +33,6 @@ lib/twowaysql/parser.rb
30
33
  lib/twowaysql/parser.y
31
34
  lib/twowaysql/template.rb
32
35
  lib/twowaysql/version.rb
33
- script/console
34
- script/destroy
35
- script/generate
36
- script/txt2html
37
36
  setup.rb
38
37
  spec/large_sql_spec.rb
39
38
  spec/learning_regex_spec.rb
@@ -44,5 +43,6 @@ tasks/deployment.rake
44
43
  tasks/ditz.rake
45
44
  tasks/environment.rake
46
45
  tasks/racc.rake
46
+ tasks/rcov.rake
47
47
  tasks/rspec.rake
48
48
  tasks/website.rake
data/README.txt CHANGED
@@ -375,10 +375,10 @@ Default is true. When true, parser preserves original whitespaces. When false, p
375
375
  EOS
376
376
  template = TwoWaySQL::Template.parse(sql, :preserve_space => false)
377
377
 
378
- result = template.merge(:job => 'MANAGER', :deptno => 30)
378
+ merged = template.merge(:job => 'MANAGER', :deptno => 30)
379
379
 
380
- result.sql #=> "SELECT * FROM emp WHERE job = ? AND deptno = ? "
381
- result.bound_variables #=> ["MANAGER", 30]
380
+ merged.sql #=> "SELECT * FROM emp WHERE job = ? AND deptno = ? "
381
+ merged.bound_variables #=> ["MANAGER", 30]
382
382
 
383
383
 
384
384
  ==== :preserve_comment (default is false)
@@ -400,7 +400,7 @@ Default is false. When true, parser preserves original actual comments. When fal
400
400
  EOS
401
401
  template = TwoWaySQL::Template.parse(sql, :preserve_comment => true)
402
402
 
403
- result = template.merge(:job => 'MANAGER', :deptno => 30)
403
+ merged = template.merge(:job => 'MANAGER', :deptno => 30)
404
404
 
405
405
  expected = <<-EOS
406
406
  SELECT
@@ -415,8 +415,8 @@ Default is false. When true, parser preserves original actual comments. When fal
415
415
  job = ?
416
416
  AND deptno = ?
417
417
  EOS
418
- result.sql == expected #=> true
419
- result.bound_variables #=> ["MANAGER", 30]
418
+ merged.sql == expected #=> true
419
+ merged.bound_variables #=> ["MANAGER", 30]
420
420
 
421
421
 
422
422
 
@@ -0,0 +1,30 @@
1
+ --- !ditz.rubyforge.org,2008-03-06/issue
2
+ title: integrate coverage report into website
3
+ desc: integrate rcov coverage report into website
4
+ type: :task
5
+ component: twowaysql
6
+ release: release_0_4
7
+ reporter: takuto <takuto.wada@gmail.com>
8
+ status: :closed
9
+ disposition: :fixed
10
+ creation_time: 2008-09-29 09:44:41.700346 Z
11
+ references: []
12
+
13
+ id: 2a172da16d3a59adc8448f2e36ec48b36951e02d
14
+ log_events:
15
+ - - 2008-09-29 09:44:42.828987 Z
16
+ - takuto <takuto.wada@gmail.com>
17
+ - created
18
+ - ""
19
+ - - 2008-09-29 17:34:57.206684 Z
20
+ - takuto <takuto.wada@gmail.com>
21
+ - changed status from unstarted to in_progress
22
+ - ""
23
+ - - 2008-09-29 17:40:10.806903 Z
24
+ - takuto <takuto.wada@gmail.com>
25
+ - assigned to release release_0_4 from unassigned
26
+ - ""
27
+ - - 2008-09-29 17:40:53.649456 Z
28
+ - takuto <takuto.wada@gmail.com>
29
+ - closed with disposition fixed
30
+ - ""
@@ -5,8 +5,8 @@ type: :feature
5
5
  component: twowaysql
6
6
  release: release_0_4
7
7
  reporter: takuto <takuto.wada@gmail.com>
8
- status: :unstarted
9
- disposition:
8
+ status: :closed
9
+ disposition: :fixed
10
10
  creation_time: 2008-09-06 07:38:16.872853 Z
11
11
  references: []
12
12
 
@@ -24,3 +24,11 @@ log_events:
24
24
  - takuto <takuto.wada@gmail.com>
25
25
  - assigned to release release_0_4 from release_0_3
26
26
  - ""
27
+ - - 2008-09-29 10:12:48.697610 Z
28
+ - takuto <takuto.wada@gmail.com>
29
+ - changed status from unstarted to in_progress
30
+ - ""
31
+ - - 2008-09-29 16:07:05.605087 Z
32
+ - takuto <takuto.wada@gmail.com>
33
+ - closed with disposition fixed
34
+ - simple implementation. now scanner passes token position with token itself.
@@ -3,10 +3,10 @@ title: integrate ditz to 'push-button release'
3
3
  desc: integrate 'ditz release' and 'ditz changelog' into rake task
4
4
  type: :task
5
5
  component: twowaysql
6
- release:
6
+ release: release_0_4
7
7
  reporter: takuto <takuto.wada@gmail.com>
8
- status: :unstarted
9
- disposition:
8
+ status: :closed
9
+ disposition: :fixed
10
10
  creation_time: 2008-09-07 17:34:42.830046 Z
11
11
  references: []
12
12
 
@@ -16,3 +16,15 @@ log_events:
16
16
  - takuto <takuto.wada@gmail.com>
17
17
  - created
18
18
  - ""
19
+ - - 2008-09-29 18:11:54.103095 Z
20
+ - takuto <takuto.wada@gmail.com>
21
+ - assigned to release release_0_4 from unassigned
22
+ - ""
23
+ - - 2008-09-29 18:13:04.946986 Z
24
+ - takuto <takuto.wada@gmail.com>
25
+ - changed status from unstarted to in_progress
26
+ - ""
27
+ - - 2008-09-29 18:20:38.750419 Z
28
+ - takuto <takuto.wada@gmail.com>
29
+ - closed with disposition fixed
30
+ - ""
@@ -0,0 +1,26 @@
1
+ --- !ditz.rubyforge.org,2008-03-06/issue
2
+ title: Change ambiguous class name TwoWaySQL::Result to TwoWaySQL::MergeResult
3
+ desc: it is merge result, not a result of db execution.
4
+ type: :task
5
+ component: twowaysql
6
+ release: release_0_4
7
+ reporter: takuto <takuto.wada@gmail.com>
8
+ status: :closed
9
+ disposition: :fixed
10
+ creation_time: 2008-09-19 18:14:34.843930 Z
11
+ references: []
12
+
13
+ id: a185b4247f64c1104bc49ebf823b57b5de3d06f8
14
+ log_events:
15
+ - - 2008-09-19 18:14:36.258181 Z
16
+ - takuto <takuto.wada@gmail.com>
17
+ - created
18
+ - ""
19
+ - - 2008-09-19 18:16:09.295390 Z
20
+ - takuto <takuto.wada@gmail.com>
21
+ - changed status from unstarted to in_progress
22
+ - ""
23
+ - - 2008-09-19 18:17:35.545561 Z
24
+ - takuto <takuto.wada@gmail.com>
25
+ - closed with disposition fixed
26
+ - ""
data/issues/project.yaml CHANGED
@@ -46,10 +46,14 @@ releases:
46
46
  - 0.2.1 release
47
47
  - !ditz.rubyforge.org,2008-03-06/release
48
48
  name: release_0_4
49
- status: :unreleased
50
- release_time:
49
+ status: :released
50
+ release_time: 2008-09-29 18:30:36.862798 Z
51
51
  log_events:
52
52
  - - 2008-09-10 06:27:14.808896 Z
53
53
  - takuto <takuto.wada@gmail.com>
54
54
  - created
55
55
  - ""
56
+ - - 2008-09-29 18:30:36.862808 Z
57
+ - takuto <takuto.wada@gmail.com>
58
+ - released
59
+ - ""
@@ -11,7 +11,7 @@ module TwoWaySQL
11
11
 
12
12
  class Parser < Racc::Parser
13
13
 
14
- module_eval <<'..end lib/twowaysql/parser.y modeval..idd0cee34b5c', 'lib/twowaysql/parser.y', 134
14
+ module_eval <<'..end lib/twowaysql/parser.y modeval..id30c07c2d1a', 'lib/twowaysql/parser.y', 134
15
15
 
16
16
  require 'strscan'
17
17
 
@@ -57,64 +57,91 @@ OR_PATTERN = /\A(\ *OR)\b/i
57
57
  def parse( io )
58
58
  @q = []
59
59
  io.each_line(nil) do |whole|
60
- s = StringScanner.new(whole)
61
- until s.eos? do
62
- case
63
- when s.scan(AND_PATTERN)
64
- @q.push [ :AND, s[1] ]
65
- when s.scan(OR_PATTERN)
66
- @q.push [ :OR, s[1] ]
67
- when s.scan(SPACES_PATTERN)
68
- @q.push [ :SPACES, s[1] ]
69
- when s.scan(QUESTION_PATTERN)
70
- @q.push [ :QUESTION, nil ]
71
- when s.scan(COMMA_PATTERN)
72
- @q.push [ :COMMA, ',' ]
73
- when s.scan(LPAREN_PATTERN)
74
- @q.push [ :LPAREN, '(' ]
75
- when s.scan(RPAREN_PATTERN)
76
- @q.push [ :RPAREN, ')' ]
77
- when s.scan(ELSE_PATTERN)
78
- @q.push [ :ELSE, nil ]
79
- when s.scan(ACTUAL_COMMENT_PATTERN)
80
- @q.push [ :ACTUAL_COMMENT, [s[1], s[2]] ] if @preserve_comment
81
- when s.scan(BEGIN_END_PATTERN)
82
- @q.push [ s[2].intern, nil ]
83
- when s.scan(CONDITIONAL_PATTERN)
84
- @q.push [ s[2].intern, s[3] ]
85
- when s.scan(EMBED_VARIABLE_PATTERN)
86
- @q.push [ :EMBED_VARIABLE, s[2] ]
87
- when s.scan(PAREN_BIND_VARIABLE_PATTERN)
88
- @q.push [ :PAREN_BIND_VARIABLE, s[2] ]
89
- when s.scan(BIND_VARIABLE_PATTERN)
90
- @q.push [ :BIND_VARIABLE, s[2] ]
91
- when s.scan(STRING_LITERAL_PATTERN)
92
- @q.push [ :STRING_LITERAL, s[1] ]
93
- when s.scan(SPLIT_TOKEN_PATTERN)
94
- @q.push [ :IDENT, s[1] ]
95
- when s.scan(UNMATCHED_COMMENT_START_PATTERN) ## unmatched comment start, '/*','#*'
96
- raise Racc::ParseError, "## unmatched comment. cannot parse [#{s.rest}]"
97
- when s.scan(LITERAL_PATTERN) ## other string token
98
- @q.push [ :IDENT, s[1] ]
99
- when s.scan(SEMICOLON_AT_INPUT_END_PATTERN)
100
- #drop semicolon at input end
101
- else
102
- raise Racc::ParseError, "## cannot parse [#{s.rest}]"
103
- end
104
- end
105
-
60
+ @s = StringScanner.new(whole)
106
61
  end
107
-
108
- @q.push [ false, nil ]
62
+ scan_str
63
+
64
+ # @q.push [ false, nil ]
65
+ @q.push [ false, [@s.pos, nil] ]
109
66
 
110
67
  ## cal racc's private parse method
111
68
  do_parse
112
69
  end
113
70
 
71
+ ## called by racc
114
72
  def next_token
115
73
  @q.shift
116
74
  end
117
- ..end lib/twowaysql/parser.y modeval..idd0cee34b5c
75
+
76
+
77
+ def scan_str
78
+ until @s.eos? do
79
+ case
80
+ when @s.scan(AND_PATTERN)
81
+ @q.push [ :AND, [@s.pos, @s[1]] ]
82
+ when @s.scan(OR_PATTERN)
83
+ @q.push [ :OR, [@s.pos, @s[1]] ]
84
+ when @s.scan(SPACES_PATTERN)
85
+ @q.push [ :SPACES, [@s.pos, @s[1]] ]
86
+ when @s.scan(QUESTION_PATTERN)
87
+ @q.push [ :QUESTION, [@s.pos, nil] ]
88
+ when @s.scan(COMMA_PATTERN)
89
+ @q.push [ :COMMA, [@s.pos, ','] ]
90
+ when @s.scan(LPAREN_PATTERN)
91
+ @q.push [ :LPAREN, [@s.pos, '('] ]
92
+ when @s.scan(RPAREN_PATTERN)
93
+ @q.push [ :RPAREN, [@s.pos, ')'] ]
94
+ when @s.scan(ELSE_PATTERN)
95
+ @q.push [ :ELSE, [@s.pos, nil] ]
96
+ when @s.scan(ACTUAL_COMMENT_PATTERN)
97
+ @q.push [ :ACTUAL_COMMENT, [@s.pos, @s[1], @s[2]] ] if @preserve_comment
98
+ when @s.scan(BEGIN_END_PATTERN)
99
+ @q.push [ @s[2].intern, [@s.pos, nil] ]
100
+ when @s.scan(CONDITIONAL_PATTERN)
101
+ @q.push [ @s[2].intern, [@s.pos, @s[3]] ]
102
+ when @s.scan(EMBED_VARIABLE_PATTERN)
103
+ @q.push [ :EMBED_VARIABLE, [@s.pos, @s[2]] ]
104
+ when @s.scan(PAREN_BIND_VARIABLE_PATTERN)
105
+ @q.push [ :PAREN_BIND_VARIABLE, [@s.pos, @s[2]] ]
106
+ when @s.scan(BIND_VARIABLE_PATTERN)
107
+ @q.push [ :BIND_VARIABLE, [@s.pos, @s[2]] ]
108
+ when @s.scan(STRING_LITERAL_PATTERN)
109
+ @q.push [ :STRING_LITERAL, [@s.pos, @s[1]] ]
110
+ when @s.scan(SPLIT_TOKEN_PATTERN)
111
+ @q.push [ :IDENT, [@s.pos, @s[1]] ]
112
+ when @s.scan(UNMATCHED_COMMENT_START_PATTERN) ## unmatched comment start, '/*','#*'
113
+ raise Racc::ParseError, "unmatched comment. line:[#{line_no(@s.pos)}], str:[#{@s.rest}]"
114
+ when @s.scan(LITERAL_PATTERN) ## other string token
115
+ @q.push [ :IDENT, [@s.pos, @s[1]] ]
116
+ when @s.scan(SEMICOLON_AT_INPUT_END_PATTERN)
117
+ #drop semicolon at input end
118
+ else
119
+ raise Racc::ParseError, "syntax error near line:[#{line_no(@s.pos)}], str:[#{@s.rest}]"
120
+ end
121
+ end
122
+ end
123
+
124
+
125
+ def on_error(t, v, vstack)
126
+ ## cursor in value-stack is an array of two items,
127
+ ## that have position value as 0th item. like [731, "ctx[:limit] "]
128
+ cursor = vstack.find do |tokens|
129
+ tokens.size == 2 and tokens[0].kind_of?(Fixnum)
130
+ end
131
+ pos = cursor[0]
132
+ line = line_no(pos)
133
+ rest = @s.string[pos .. -1]
134
+ raise Racc::ParseError, "syntax error near line:[#{line}], str:[#{rest}]"
135
+ end
136
+
137
+
138
+ def line_no(pos)
139
+ lines = 0
140
+ scanned = @s.string[0..(pos)]
141
+ scanned.each_line { lines += 1 }
142
+ lines
143
+ end
144
+ ..end lib/twowaysql/parser.y modeval..id30c07c2d1a
118
145
 
119
146
  ##### racc 1.4.5 generates ###
120
147
 
@@ -334,7 +361,7 @@ module_eval <<'.,.,', 'lib/twowaysql/parser.y', 26
334
361
 
335
362
  module_eval <<'.,.,', 'lib/twowaysql/parser.y', 31
336
363
  def _reduce_8( val, _values, result )
337
- result = IfNode.new( val[0], val[1], val[2] )
364
+ result = IfNode.new( val[0][1], val[1], val[2] )
338
365
  result
339
366
  end
340
367
  .,.,
@@ -361,70 +388,70 @@ module_eval <<'.,.,', 'lib/twowaysql/parser.y', 40
361
388
 
362
389
  module_eval <<'.,.,', 'lib/twowaysql/parser.y', 49
363
390
  def _reduce_14( val, _values, result )
364
- result = SubStatementNode.new( val[0], val[1] )
391
+ result = SubStatementNode.new( val[0][1], val[1] )
365
392
  result
366
393
  end
367
394
  .,.,
368
395
 
369
396
  module_eval <<'.,.,', 'lib/twowaysql/parser.y', 54
370
397
  def _reduce_15( val, _values, result )
371
- result = SubStatementNode.new( val[0], val[1] )
398
+ result = SubStatementNode.new( val[0][1], val[1] )
372
399
  result
373
400
  end
374
401
  .,.,
375
402
 
376
403
  module_eval <<'.,.,', 'lib/twowaysql/parser.y', 59
377
404
  def _reduce_16( val, _values, result )
378
- result = LiteralNode.new( val[0] )
405
+ result = LiteralNode.new( val[0][1] )
379
406
  result
380
407
  end
381
408
  .,.,
382
409
 
383
410
  module_eval <<'.,.,', 'lib/twowaysql/parser.y', 63
384
411
  def _reduce_17( val, _values, result )
385
- result = LiteralNode.new( val[0] )
412
+ result = LiteralNode.new( val[0][1] )
386
413
  result
387
414
  end
388
415
  .,.,
389
416
 
390
417
  module_eval <<'.,.,', 'lib/twowaysql/parser.y', 67
391
418
  def _reduce_18( val, _values, result )
392
- result = LiteralNode.new( val[0] )
419
+ result = LiteralNode.new( val[0][1] )
393
420
  result
394
421
  end
395
422
  .,.,
396
423
 
397
424
  module_eval <<'.,.,', 'lib/twowaysql/parser.y', 71
398
425
  def _reduce_19( val, _values, result )
399
- result = LiteralNode.new( val[0] )
426
+ result = LiteralNode.new( val[0][1] )
400
427
  result
401
428
  end
402
429
  .,.,
403
430
 
404
431
  module_eval <<'.,.,', 'lib/twowaysql/parser.y', 75
405
432
  def _reduce_20( val, _values, result )
406
- result = WhiteSpaceNode.new( val[0], @preserve_space )
433
+ result = WhiteSpaceNode.new( val[0][1], @preserve_space )
407
434
  result
408
435
  end
409
436
  .,.,
410
437
 
411
438
  module_eval <<'.,.,', 'lib/twowaysql/parser.y', 79
412
439
  def _reduce_21( val, _values, result )
413
- result = LiteralNode.new( val[0] )
440
+ result = LiteralNode.new( val[0][1] )
414
441
  result
415
442
  end
416
443
  .,.,
417
444
 
418
445
  module_eval <<'.,.,', 'lib/twowaysql/parser.y', 83
419
446
  def _reduce_22( val, _values, result )
420
- result = LiteralNode.new( val[0] )
447
+ result = LiteralNode.new( val[0][1] )
421
448
  result
422
449
  end
423
450
  .,.,
424
451
 
425
452
  module_eval <<'.,.,', 'lib/twowaysql/parser.y', 87
426
453
  def _reduce_23( val, _values, result )
427
- result = LiteralNode.new( val[0] )
454
+ result = LiteralNode.new( val[0][1] )
428
455
  result
429
456
  end
430
457
  .,.,
@@ -439,7 +466,7 @@ module_eval <<'.,.,', 'lib/twowaysql/parser.y', 92
439
466
 
440
467
  module_eval <<'.,.,', 'lib/twowaysql/parser.y', 96
441
468
  def _reduce_25( val, _values, result )
442
- result = ActualCommentNode.new( val[0][0] , val[0][1] )
469
+ result = ActualCommentNode.new( val[0][1] , val[0][2] )
443
470
  result
444
471
  end
445
472
  .,.,
@@ -450,49 +477,49 @@ module_eval <<'.,.,', 'lib/twowaysql/parser.y', 96
450
477
 
451
478
  module_eval <<'.,.,', 'lib/twowaysql/parser.y', 103
452
479
  def _reduce_28( val, _values, result )
453
- result = BindVariableNode.new( val[0] )
480
+ result = BindVariableNode.new( val[0][1] )
454
481
  result
455
482
  end
456
483
  .,.,
457
484
 
458
485
  module_eval <<'.,.,', 'lib/twowaysql/parser.y', 107
459
486
  def _reduce_29( val, _values, result )
460
- result = BindVariableNode.new( val[0] )
487
+ result = BindVariableNode.new( val[0][1] )
461
488
  result
462
489
  end
463
490
  .,.,
464
491
 
465
492
  module_eval <<'.,.,', 'lib/twowaysql/parser.y', 111
466
493
  def _reduce_30( val, _values, result )
467
- result = BindVariableNode.new( val[0] )
494
+ result = BindVariableNode.new( val[0][1] )
468
495
  result
469
496
  end
470
497
  .,.,
471
498
 
472
499
  module_eval <<'.,.,', 'lib/twowaysql/parser.y', 115
473
500
  def _reduce_31( val, _values, result )
474
- result = BindVariableNode.new( val[0] )
501
+ result = BindVariableNode.new( val[0][1] )
475
502
  result
476
503
  end
477
504
  .,.,
478
505
 
479
506
  module_eval <<'.,.,', 'lib/twowaysql/parser.y', 119
480
507
  def _reduce_32( val, _values, result )
481
- result = ParenBindVariableNode.new( val[0] )
508
+ result = ParenBindVariableNode.new( val[0][1] )
482
509
  result
483
510
  end
484
511
  .,.,
485
512
 
486
513
  module_eval <<'.,.,', 'lib/twowaysql/parser.y', 124
487
514
  def _reduce_33( val, _values, result )
488
- result = EmbedVariableNode.new( val[0] )
515
+ result = EmbedVariableNode.new( val[0][1] )
489
516
  result
490
517
  end
491
518
  .,.,
492
519
 
493
520
  module_eval <<'.,.,', 'lib/twowaysql/parser.y', 128
494
521
  def _reduce_34( val, _values, result )
495
- result = EmbedVariableNode.new( val[0] )
522
+ result = EmbedVariableNode.new( val[0][1] )
496
523
  result
497
524
  end
498
525
  .,.,
@@ -27,7 +27,7 @@ begin_stmt : BEGIN stmt_list END
27
27
 
28
28
  if_stmt : IF sub_stmt else_stmt END
29
29
  {
30
- result = IfNode.new( val[0], val[1], val[2] )
30
+ result = IfNode.new( val[0][1], val[1], val[2] )
31
31
  }
32
32
 
33
33
  else_stmt : ELSE sub_stmt
@@ -45,45 +45,45 @@ sub_stmt : and_stmt
45
45
 
46
46
  and_stmt : AND stmt_list
47
47
  {
48
- result = SubStatementNode.new( val[0], val[1] )
48
+ result = SubStatementNode.new( val[0][1], val[1] )
49
49
  }
50
50
 
51
51
  or_stmt : OR stmt_list
52
52
  {
53
- result = SubStatementNode.new( val[0], val[1] )
53
+ result = SubStatementNode.new( val[0][1], val[1] )
54
54
  }
55
55
 
56
56
  primary : IDENT
57
57
  {
58
- result = LiteralNode.new( val[0] )
58
+ result = LiteralNode.new( val[0][1] )
59
59
  }
60
60
  | STRING_LITERAL
61
61
  {
62
- result = LiteralNode.new( val[0] )
62
+ result = LiteralNode.new( val[0][1] )
63
63
  }
64
64
  | AND
65
65
  {
66
- result = LiteralNode.new( val[0] )
66
+ result = LiteralNode.new( val[0][1] )
67
67
  }
68
68
  | OR
69
69
  {
70
- result = LiteralNode.new( val[0] )
70
+ result = LiteralNode.new( val[0][1] )
71
71
  }
72
72
  | SPACES
73
73
  {
74
- result = WhiteSpaceNode.new( val[0], @preserve_space )
74
+ result = WhiteSpaceNode.new( val[0][1], @preserve_space )
75
75
  }
76
76
  | COMMA
77
77
  {
78
- result = LiteralNode.new( val[0] )
78
+ result = LiteralNode.new( val[0][1] )
79
79
  }
80
80
  | LPAREN
81
81
  {
82
- result = LiteralNode.new( val[0] )
82
+ result = LiteralNode.new( val[0][1] )
83
83
  }
84
84
  | RPAREN
85
85
  {
86
- result = LiteralNode.new( val[0] )
86
+ result = LiteralNode.new( val[0][1] )
87
87
  }
88
88
  | QUESTION
89
89
  {
@@ -92,39 +92,39 @@ primary : IDENT
92
92
  }
93
93
  | ACTUAL_COMMENT
94
94
  {
95
- result = ActualCommentNode.new( val[0][0] , val[0][1] )
95
+ result = ActualCommentNode.new( val[0][1] , val[0][2] )
96
96
  }
97
97
  | bind_var
98
98
  | embed_var
99
99
 
100
100
  bind_var : BIND_VARIABLE STRING_LITERAL
101
101
  {
102
- result = BindVariableNode.new( val[0] )
102
+ result = BindVariableNode.new( val[0][1] )
103
103
  }
104
104
  | BIND_VARIABLE SPACES STRING_LITERAL
105
105
  {
106
- result = BindVariableNode.new( val[0] )
106
+ result = BindVariableNode.new( val[0][1] )
107
107
  }
108
108
  | BIND_VARIABLE IDENT
109
109
  {
110
- result = BindVariableNode.new( val[0] )
110
+ result = BindVariableNode.new( val[0][1] )
111
111
  }
112
112
  | BIND_VARIABLE SPACES IDENT
113
113
  {
114
- result = BindVariableNode.new( val[0] )
114
+ result = BindVariableNode.new( val[0][1] )
115
115
  }
116
116
  | PAREN_BIND_VARIABLE
117
117
  {
118
- result = ParenBindVariableNode.new( val[0] )
118
+ result = ParenBindVariableNode.new( val[0][1] )
119
119
  }
120
120
 
121
121
  embed_var : EMBED_VARIABLE IDENT
122
122
  {
123
- result = EmbedVariableNode.new( val[0] )
123
+ result = EmbedVariableNode.new( val[0][1] )
124
124
  }
125
125
  | EMBED_VARIABLE SPACES IDENT
126
126
  {
127
- result = EmbedVariableNode.new( val[0] )
127
+ result = EmbedVariableNode.new( val[0][1] )
128
128
  }
129
129
 
130
130
  end
@@ -176,60 +176,87 @@ OR_PATTERN = /\A(\ *OR)\b/i
176
176
  def parse( io )
177
177
  @q = []
178
178
  io.each_line(nil) do |whole|
179
- s = StringScanner.new(whole)
180
- until s.eos? do
181
- case
182
- when s.scan(AND_PATTERN)
183
- @q.push [ :AND, s[1] ]
184
- when s.scan(OR_PATTERN)
185
- @q.push [ :OR, s[1] ]
186
- when s.scan(SPACES_PATTERN)
187
- @q.push [ :SPACES, s[1] ]
188
- when s.scan(QUESTION_PATTERN)
189
- @q.push [ :QUESTION, nil ]
190
- when s.scan(COMMA_PATTERN)
191
- @q.push [ :COMMA, ',' ]
192
- when s.scan(LPAREN_PATTERN)
193
- @q.push [ :LPAREN, '(' ]
194
- when s.scan(RPAREN_PATTERN)
195
- @q.push [ :RPAREN, ')' ]
196
- when s.scan(ELSE_PATTERN)
197
- @q.push [ :ELSE, nil ]
198
- when s.scan(ACTUAL_COMMENT_PATTERN)
199
- @q.push [ :ACTUAL_COMMENT, [s[1], s[2]] ] if @preserve_comment
200
- when s.scan(BEGIN_END_PATTERN)
201
- @q.push [ s[2].intern, nil ]
202
- when s.scan(CONDITIONAL_PATTERN)
203
- @q.push [ s[2].intern, s[3] ]
204
- when s.scan(EMBED_VARIABLE_PATTERN)
205
- @q.push [ :EMBED_VARIABLE, s[2] ]
206
- when s.scan(PAREN_BIND_VARIABLE_PATTERN)
207
- @q.push [ :PAREN_BIND_VARIABLE, s[2] ]
208
- when s.scan(BIND_VARIABLE_PATTERN)
209
- @q.push [ :BIND_VARIABLE, s[2] ]
210
- when s.scan(STRING_LITERAL_PATTERN)
211
- @q.push [ :STRING_LITERAL, s[1] ]
212
- when s.scan(SPLIT_TOKEN_PATTERN)
213
- @q.push [ :IDENT, s[1] ]
214
- when s.scan(UNMATCHED_COMMENT_START_PATTERN) ## unmatched comment start, '/*','#*'
215
- raise Racc::ParseError, "## unmatched comment. cannot parse [#{s.rest}]"
216
- when s.scan(LITERAL_PATTERN) ## other string token
217
- @q.push [ :IDENT, s[1] ]
218
- when s.scan(SEMICOLON_AT_INPUT_END_PATTERN)
219
- #drop semicolon at input end
220
- else
221
- raise Racc::ParseError, "## cannot parse [#{s.rest}]"
222
- end
223
- end
224
-
179
+ @s = StringScanner.new(whole)
225
180
  end
226
-
227
- @q.push [ false, nil ]
181
+ scan_str
182
+
183
+ # @q.push [ false, nil ]
184
+ @q.push [ false, [@s.pos, nil] ]
228
185
 
229
186
  ## cal racc's private parse method
230
187
  do_parse
231
188
  end
232
189
 
190
+ ## called by racc
233
191
  def next_token
234
192
  @q.shift
235
193
  end
194
+
195
+
196
+ def scan_str
197
+ until @s.eos? do
198
+ case
199
+ when @s.scan(AND_PATTERN)
200
+ @q.push [ :AND, [@s.pos, @s[1]] ]
201
+ when @s.scan(OR_PATTERN)
202
+ @q.push [ :OR, [@s.pos, @s[1]] ]
203
+ when @s.scan(SPACES_PATTERN)
204
+ @q.push [ :SPACES, [@s.pos, @s[1]] ]
205
+ when @s.scan(QUESTION_PATTERN)
206
+ @q.push [ :QUESTION, [@s.pos, nil] ]
207
+ when @s.scan(COMMA_PATTERN)
208
+ @q.push [ :COMMA, [@s.pos, ','] ]
209
+ when @s.scan(LPAREN_PATTERN)
210
+ @q.push [ :LPAREN, [@s.pos, '('] ]
211
+ when @s.scan(RPAREN_PATTERN)
212
+ @q.push [ :RPAREN, [@s.pos, ')'] ]
213
+ when @s.scan(ELSE_PATTERN)
214
+ @q.push [ :ELSE, [@s.pos, nil] ]
215
+ when @s.scan(ACTUAL_COMMENT_PATTERN)
216
+ @q.push [ :ACTUAL_COMMENT, [@s.pos, @s[1], @s[2]] ] if @preserve_comment
217
+ when @s.scan(BEGIN_END_PATTERN)
218
+ @q.push [ @s[2].intern, [@s.pos, nil] ]
219
+ when @s.scan(CONDITIONAL_PATTERN)
220
+ @q.push [ @s[2].intern, [@s.pos, @s[3]] ]
221
+ when @s.scan(EMBED_VARIABLE_PATTERN)
222
+ @q.push [ :EMBED_VARIABLE, [@s.pos, @s[2]] ]
223
+ when @s.scan(PAREN_BIND_VARIABLE_PATTERN)
224
+ @q.push [ :PAREN_BIND_VARIABLE, [@s.pos, @s[2]] ]
225
+ when @s.scan(BIND_VARIABLE_PATTERN)
226
+ @q.push [ :BIND_VARIABLE, [@s.pos, @s[2]] ]
227
+ when @s.scan(STRING_LITERAL_PATTERN)
228
+ @q.push [ :STRING_LITERAL, [@s.pos, @s[1]] ]
229
+ when @s.scan(SPLIT_TOKEN_PATTERN)
230
+ @q.push [ :IDENT, [@s.pos, @s[1]] ]
231
+ when @s.scan(UNMATCHED_COMMENT_START_PATTERN) ## unmatched comment start, '/*','#*'
232
+ raise Racc::ParseError, "unmatched comment. line:[#{line_no(@s.pos)}], str:[#{@s.rest}]"
233
+ when @s.scan(LITERAL_PATTERN) ## other string token
234
+ @q.push [ :IDENT, [@s.pos, @s[1]] ]
235
+ when @s.scan(SEMICOLON_AT_INPUT_END_PATTERN)
236
+ #drop semicolon at input end
237
+ else
238
+ raise Racc::ParseError, "syntax error near line:[#{line_no(@s.pos)}], str:[#{@s.rest}]"
239
+ end
240
+ end
241
+ end
242
+
243
+
244
+ def on_error(t, v, vstack)
245
+ ## cursor in value-stack is an array of two items,
246
+ ## that have position value as 0th item. like [731, "ctx[:limit] "]
247
+ cursor = vstack.find do |tokens|
248
+ tokens.size == 2 and tokens[0].kind_of?(Fixnum)
249
+ end
250
+ pos = cursor[0]
251
+ line = line_no(pos)
252
+ rest = @s.string[pos .. -1]
253
+ raise Racc::ParseError, "syntax error near line:[#{line}], str:[#{rest}]"
254
+ end
255
+
256
+
257
+ def line_no(pos)
258
+ lines = 0
259
+ scanned = @s.string[0..(pos)]
260
+ scanned.each_line { lines += 1 }
261
+ lines
262
+ end
@@ -44,12 +44,12 @@ module TwoWaySQL
44
44
  #
45
45
  # === Return
46
46
  #
47
- # TwoWaySQL::Result object that represents merge result
47
+ # TwoWaySQL::MergeResult object that represents merge result
48
48
  #
49
49
  def merge(data)
50
50
  c = Context.new(data)
51
51
  @root.accept(c)
52
- Result.new(c)
52
+ MergeResult.new(c)
53
53
  end
54
54
  alias mungle merge
55
55
 
@@ -60,7 +60,7 @@ module TwoWaySQL
60
60
  end
61
61
 
62
62
 
63
- # TwoWaySQL::Result represents merge result of template and data.
63
+ # TwoWaySQL::MergeResult represents merge result of template and data.
64
64
  # it contains SQL string with placeholders, and bound variables associated with placeholders.
65
65
  #
66
66
  # === Usage
@@ -69,7 +69,7 @@ module TwoWaySQL
69
69
  # merged.sql #=> "SELECT * FROM emp WHERE job = ? AND deptno = ?"
70
70
  # merged.bound_variables #=> ["HOGE", 30]
71
71
  #
72
- class Result
72
+ class MergeResult
73
73
  def initialize(context)
74
74
  @context = context
75
75
  end
@@ -84,9 +84,10 @@ module TwoWaySQL
84
84
  end
85
85
 
86
86
  # return array of variables which indices are corresponding to placeholders.
87
+ # alias 'vars' is available for short-hand.
87
88
  #
88
89
  # === Return
89
- # merge result SQL with placeholders
90
+ # array of bound variables
90
91
  #
91
92
  def bound_variables
92
93
  @context.bound_variables
@@ -1,7 +1,7 @@
1
1
  module TwoWaySQL
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
- MINOR = 3
4
+ MINOR = 4
5
5
  TINY = 0
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
@@ -236,4 +236,94 @@ EOS
236
236
  end
237
237
  end
238
238
 
239
+
240
+
241
+
242
+ describe "guess line number on multi-line SQL syntax error" do
243
+
244
+ it "non-nested unmatched IF-END" do
245
+ sql = <<-EOS
246
+ SELECT
247
+ i.id AS item_id
248
+ ,d.display_name AS display_name
249
+
250
+ FROM
251
+ some_schema.item i
252
+ INNER JOIN some_schema.item_detail d
253
+ ON i.id = d.item_id
254
+
255
+ /*IF ctx[:order_by] */ ORDER BY /*$ctx[:order_by]*/i.id /*$ctx[:order]*/ASC /* no END comment */
256
+ /*IF ctx[:limit] */ LIMIT /*ctx[:limit]*/10/*END*/
257
+ /*IF ctx[:offset] */ OFFSET /*ctx[:offset]*/0/*END*/
258
+ EOS
259
+ begin
260
+ TwoWaySQL::Template.parse(sql)
261
+ rescue Racc::ParseError => e
262
+ e.to_s.should match(/line:\[10\]/)
263
+ end
264
+ end
265
+
266
+
267
+ it "no-END on input end" do
268
+ sql = <<-EOS
269
+ SELECT
270
+ i.id AS item_id
271
+ ,d.display_name AS display_name
272
+
273
+ FROM
274
+ some_schema.item i
275
+ INNER JOIN some_schema.item_detail d
276
+ ON i.id = d.item_id
277
+
278
+ /*IF ctx[:order_by] */ ORDER BY /*$ctx[:order_by]*/i.id /*$ctx[:order]*/ASC/*END*/
279
+ /*IF ctx[:limit] */ LIMIT /*ctx[:limit]*/10/*END*/
280
+ /*IF ctx[:offset] */ OFFSET /*ctx[:offset]*/0
281
+ EOS
282
+ begin
283
+ TwoWaySQL::Template.parse(sql)
284
+ rescue Racc::ParseError => e
285
+ e.to_s.should match(/line:\[12\]/)
286
+ e.to_s.should match(/OFFSET \/\*ctx\[:offset\]\*\/0/)
287
+
288
+ end
289
+ end
290
+
291
+
292
+ it "unmatched BEGIN-END" do
293
+ sql = <<-EOS
294
+ SELECT DISTINCT
295
+ i.id AS item_id
296
+ ,d.display_name AS display_name
297
+ ,h.status AS status_id
298
+ ,i.unique_name AS unique_name
299
+ ,i.created_on
300
+ FROM
301
+ some_schema.item i
302
+ INNER JOIN some_schema.item_detail d
303
+ ON i.id = d.item_id
304
+ INNER JOIN some_schema.item_history h
305
+ ON i.id = h.item_id
306
+
307
+ /*BEGIN*/WHERE /* line:14 */
308
+ /*IF ctx[:name] */i.name ILIKE /*ctx[:name]*/'hoge%'/*END*/
309
+ /*IF ctx[:display_name] */AND d.display_name ILIKE /*ctx[:display_name]*/'hoge%'/*END*/
310
+ /*IF ctx[:status] */AND h.status IN /*ctx[:status]*/(3, 4, 9) /* no-END at line:17 */
311
+ /*IF ctx[:ignore_status] */AND h.status NOT IN /*ctx[:ignore_status]*/(4, 9)/*END*/
312
+ /*END*/
313
+
314
+ /*IF ctx[:order_by] */ ORDER BY /*$ctx[:order_by]*/i.id /*$ctx[:order]*/ASC /*END*/
315
+ /*IF ctx[:limit] */ LIMIT /*ctx[:limit]*/10/*END*/
316
+ /*IF ctx[:offset] */ OFFSET /*ctx[:offset]*/0/*END*/
317
+ EOS
318
+ begin
319
+ TwoWaySQL::Template.parse(sql)
320
+ rescue Racc::ParseError => e
321
+ # unmatched END is at line 17 but value stack indicates open BEGIN statement
322
+ e.to_s.should match(/line:\[14\]/)
323
+ end
324
+ end
325
+
326
+ end
327
+
328
+
239
329
  end
@@ -609,6 +609,23 @@ describe TwoWaySQL::Template do
609
609
  end
610
610
 
611
611
 
612
+ describe "show line number of SQL when parse error has occurred" do
613
+ it "single line" do
614
+ begin
615
+ TwoWaySQL::Template.parse("SELECT * FROM emp/*hoge")
616
+ rescue Racc::ParseError => e
617
+ e.to_s.should match(/line:\[1\]/)
618
+ end
619
+ end
620
+ it "multiple lines" do
621
+ begin
622
+ TwoWaySQL::Template.parse("SELECT\n *\n FROM\n emp\n/*hoge")
623
+ rescue Racc::ParseError => e
624
+ e.to_s.should match(/line:\[5\]/)
625
+ end
626
+ end
627
+ end
628
+
612
629
 
613
630
  describe "when parsed from '/*BEGIN*/'" do
614
631
  it "should cause parse error" do
@@ -1,5 +1,5 @@
1
1
  desc 'Release the website and new gem version'
2
- task :deploy => [:check_version, :website, :release] do
2
+ task :deploy => [:check_version, :ditz_release, :website, :release] do
3
3
  puts "Remember to create SVN tag:"
4
4
  puts "svn copy svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/trunk " +
5
5
  "svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/tags/REL-#{VERS} "
@@ -33,13 +33,12 @@ namespace :manifest do
33
33
 
34
34
  # this task is inspired by http://d.hatena.ne.jp/bellbind/20070605/1180979599
35
35
  glob_pattern = File.join("**", "*")
36
- exclude_patterns = [
37
- /^pkg/,
38
- /^doc/,
39
- /^website/,
40
- /^\.git/,
41
- /.*\.output/
42
- ]
36
+ exclude_patterns = []
37
+ File.open('Manifest.skip') do |file|
38
+ while line = file.gets
39
+ exclude_patterns << Regexp.new(line.chomp)
40
+ end
41
+ end
43
42
 
44
43
  files = Dir.glob(glob_pattern).delete_if do |fname|
45
44
  File.directory?(fname) or
data/tasks/ditz.rake CHANGED
@@ -3,3 +3,22 @@ task :ditz_report do
3
3
  puts 'generate ditz report'
4
4
  `ditz -i issues html website/issues`
5
5
  end
6
+
7
+ desc 'ditz release'
8
+ task :ditz_release do
9
+ unless ENV['DITZ_REL']
10
+ puts 'Must pass a DITZ_REL=release_name'
11
+ exit
12
+ end
13
+
14
+ release = ENV['DITZ_REL']
15
+ puts "ditz release #{release}"
16
+ `ditz -n -i issues release #{release}`
17
+
18
+ mv 'History.txt', 'History.txt.tmp'
19
+ puts "generate changelog for #{release}"
20
+ `ditz -i issues changelog #{release} > History.txt`
21
+ `echo '' >> History.txt`
22
+ `cat History.txt.tmp >> History.txt`
23
+ rm 'History.txt.tmp'
24
+ end
data/tasks/rcov.rake ADDED
@@ -0,0 +1,5 @@
1
+ desc 'generate RCov html report'
2
+ task :rcov_report do
3
+ puts 'generate RCov coverage report'
4
+ `rcov -o website/coverage --exclude spec spec/*_spec.rb`
5
+ end
data/tasks/website.rake CHANGED
@@ -1,5 +1,5 @@
1
1
  desc 'Generate website files'
2
- task :website_generate => [:ruby_env,:ditz_report] do
2
+ task :website_generate => [:ruby_env,:rcov_report,:ditz_report] do
3
3
  (Dir['website/**/*.txt'] - Dir['website/version*.txt']).each do |txt|
4
4
  sh %{ #{RUBY_APP} script/txt2html #{txt} > #{txt.gsub(/txt$/,'html')} }
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: twowaysql
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Takuto Wada
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-09-10 00:00:00 +09:00
12
+ date: 2008-09-30 00:00:00 +09:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -37,6 +37,7 @@ extra_rdoc_files:
37
37
  files:
38
38
  - History.txt
39
39
  - License.txt
40
+ - Manifest.skip
40
41
  - Manifest.txt
41
42
  - README.txt
42
43
  - Rakefile
@@ -47,6 +48,7 @@ files:
47
48
  - issues/issue-25efcfc383f3b0f6c0e2730ae7c2975bb2b3de26.yaml
48
49
  - issues/issue-279105dd0d9f03514d318f5eab5e99c4c2d47fda.yaml
49
50
  - issues/issue-28cde89ed3eb306957edc90595b1d16bf43daf42.yaml
51
+ - issues/issue-2a172da16d3a59adc8448f2e36ec48b36951e02d.yaml
50
52
  - issues/issue-39023ea09e17e2d64bcef03aa59cdfe38b78ad5b.yaml
51
53
  - issues/issue-4bc308d55ae91f266e656162a4147d356de1166c.yaml
52
54
  - issues/issue-5c973ef5bb074eacca0c6c84f7d27c4267773ea8.yaml
@@ -54,6 +56,7 @@ files:
54
56
  - issues/issue-6daccddf089d11d42bf016897da98f70cf5ab46c.yaml
55
57
  - issues/issue-897995fa10377eabdf597e8e7692f17087c76923.yaml
56
58
  - issues/issue-901f65630639507c8b05b466790e9f22256c6450.yaml
59
+ - issues/issue-a185b4247f64c1104bc49ebf823b57b5de3d06f8.yaml
57
60
  - issues/issue-bd38c1cdc965d73dd629a81db2de1bcdcf4b10b8.yaml
58
61
  - issues/issue-dca4b19aa13de59838b33e03252bf824670a2d12.yaml
59
62
  - issues/issue-f1bd40de5458397d9b142ea3e197e5264e0dcdbf.yaml
@@ -67,10 +70,6 @@ files:
67
70
  - lib/twowaysql/parser.y
68
71
  - lib/twowaysql/template.rb
69
72
  - lib/twowaysql/version.rb
70
- - script/console
71
- - script/destroy
72
- - script/generate
73
- - script/txt2html
74
73
  - setup.rb
75
74
  - spec/large_sql_spec.rb
76
75
  - spec/learning_regex_spec.rb
@@ -81,6 +80,7 @@ files:
81
80
  - tasks/ditz.rake
82
81
  - tasks/environment.rake
83
82
  - tasks/racc.rake
83
+ - tasks/rcov.rake
84
84
  - tasks/rspec.rake
85
85
  - tasks/website.rake
86
86
  has_rdoc: true
data/script/console DELETED
@@ -1,10 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # File: script/console
3
- irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
4
-
5
- libs = " -r irb/completion"
6
- # Perhaps use a console_lib to store any extra methods I may want available in the cosole
7
- # libs << " -r #{File.dirname(__FILE__) + '/../lib/console_lib/console_logger.rb'}"
8
- libs << " -r #{File.dirname(__FILE__) + '/../lib/twowaysql.rb'}"
9
- puts "Loading twowaysql gem"
10
- exec "#{irb} #{libs} --simple-prompt"
data/script/destroy DELETED
@@ -1,14 +0,0 @@
1
- #!/usr/bin/env ruby
2
- APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
3
-
4
- begin
5
- require 'rubigen'
6
- rescue LoadError
7
- require 'rubygems'
8
- require 'rubigen'
9
- end
10
- require 'rubigen/scripts/destroy'
11
-
12
- ARGV.shift if ['--help', '-h'].include?(ARGV[0])
13
- RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
14
- RubiGen::Scripts::Destroy.new.run(ARGV)
data/script/generate DELETED
@@ -1,14 +0,0 @@
1
- #!/usr/bin/env ruby
2
- APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
3
-
4
- begin
5
- require 'rubigen'
6
- rescue LoadError
7
- require 'rubygems'
8
- require 'rubigen'
9
- end
10
- require 'rubigen/scripts/generate'
11
-
12
- ARGV.shift if ['--help', '-h'].include?(ARGV[0])
13
- RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
14
- RubiGen::Scripts::Generate.new.run(ARGV)
data/script/txt2html DELETED
@@ -1,82 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- GEM_NAME = 'twowaysql' # what ppl will type to install your gem
4
- RUBYFORGE_PROJECT = 'twowaysql'
5
-
6
- require 'rubygems'
7
- begin
8
- require 'newgem'
9
- require 'rubyforge'
10
- rescue LoadError
11
- puts "\n\nGenerating the website requires the newgem RubyGem"
12
- puts "Install: gem install newgem\n\n"
13
- exit(1)
14
- end
15
- require 'redcloth'
16
- require 'syntax/convertors/html'
17
- require 'erb'
18
- require File.dirname(__FILE__) + "/../lib/#{GEM_NAME}/version.rb"
19
-
20
- version = TwoWaySQL::VERSION::STRING
21
- download = "http://rubyforge.org/projects/#{RUBYFORGE_PROJECT}"
22
-
23
- def rubyforge_project_id
24
- RubyForge.new.autoconfig["group_ids"][RUBYFORGE_PROJECT]
25
- end
26
-
27
- class Fixnum
28
- def ordinal
29
- # teens
30
- return 'th' if (10..19).include?(self % 100)
31
- # others
32
- case self % 10
33
- when 1: return 'st'
34
- when 2: return 'nd'
35
- when 3: return 'rd'
36
- else return 'th'
37
- end
38
- end
39
- end
40
-
41
- class Time
42
- def pretty
43
- return "#{mday}#{mday.ordinal} #{strftime('%B')} #{year}"
44
- end
45
- end
46
-
47
- def convert_syntax(syntax, source)
48
- return Syntax::Convertors::HTML.for_syntax(syntax).convert(source).gsub(%r!^<pre>|</pre>$!,'')
49
- end
50
-
51
- if ARGV.length >= 1
52
- src, template = ARGV
53
- template ||= File.join(File.dirname(__FILE__), '/../website/template.html.erb')
54
- else
55
- puts("Usage: #{File.split($0).last} source.txt [template.html.erb] > output.html")
56
- exit!
57
- end
58
-
59
- template = ERB.new(File.open(template).read)
60
-
61
- title = nil
62
- body = nil
63
- File.open(src) do |fsrc|
64
- title_text = fsrc.readline
65
- body_text_template = fsrc.read
66
- body_text = ERB.new(body_text_template).result(binding)
67
- syntax_items = []
68
- body_text.gsub!(%r!<(pre|code)[^>]*?syntax=['"]([^'"]+)[^>]*>(.*?)</\1>!m){
69
- ident = syntax_items.length
70
- element, syntax, source = $1, $2, $3
71
- syntax_items << "<#{element} class='syntax'>#{convert_syntax(syntax, source)}</#{element}>"
72
- "syntax-temp-#{ident}"
73
- }
74
- title = RedCloth.new(title_text).to_html.gsub(%r!<.*?>!,'').strip
75
- body = RedCloth.new(body_text).to_html
76
- body.gsub!(%r!(?:<pre><code>)?syntax-temp-(\d+)(?:</code></pre>)?!){ syntax_items[$1.to_i] }
77
- end
78
- stat = File.stat(src)
79
- created = stat.ctime
80
- modified = stat.mtime
81
-
82
- $stdout << template.result(binding)