i_dig_sql 2.0.0 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,43 @@
1
+
2
+ class I_Dig_Sql
3
+ class H < Hash
4
+
5
+ def initialize *options
6
+ @h_option = {}
7
+ options.each { |name|
8
+ case name
9
+ when :allow_update
10
+ @h_option[:allow_update] = true
11
+ else
12
+ fail ArgumentError, "Unknown option: #{name.inspect}"
13
+ end
14
+ }
15
+
16
+ super()
17
+ end
18
+
19
+ def [] name
20
+ fail ArgumentError, "Unknown key: #{name.inspect}" unless has_key?(name)
21
+ super
22
+ end
23
+
24
+ def []= name, val
25
+ if has_key?(name) && self[name] != val && !@h_option[:allow_update]
26
+ fail ArgumentError, "Key already set: #{name.inspect}"
27
+ end
28
+
29
+ super
30
+ end
31
+
32
+ def merge! *args
33
+ args.each { |h|
34
+ h.each { |k,v|
35
+ self[k] = v
36
+ }
37
+ }
38
+ self
39
+ end
40
+
41
+ end # === class H
42
+ end # === I_Dig_Sql
43
+
@@ -0,0 +1,84 @@
1
+
2
+
3
+ describe :I_Dig_Sql do
4
+
5
+ it "runs the code from README.md" do
6
+ readme = File.read(File.expand_path(File.dirname(__FILE__) + '/../README.md'))
7
+ code = readme[/```ruby([^`]+)```/] && $1
8
+ line = 0
9
+ readme.split("\n").detect { |l| line = line + 1; l['```ruby'] }
10
+ result = eval(code, nil, 'README.md', line)
11
+ sql(result).should == sql(%^
12
+ WITH
13
+ HEROES AS ( SELECT id FROM hero WHERE id = :PERSON_ID ),
14
+ VILLIANS AS ( SELECT id FROM villian WHERE id = :PERSON_ID )
15
+ SELECT * FROM people
16
+ WHERE
17
+ id IN ( SELECT id FROM hero WHERE id = :PERSON_ID AND status = :ALIVE)
18
+ OR
19
+ id IN (SELECT ID FROM HEROES AND status = :ALIVE)
20
+ OR
21
+ id IN ( SELECT * FROM HEROES )
22
+ OR
23
+ id IN ( SELECT patron_id FROM VILLIANS )
24
+ OR
25
+ id IN ( SELECT id FROM villian WHERE id = :PERSON_ID )
26
+ ^)
27
+ end # === it
28
+
29
+ it "adds WITH: {{MY_NAME}}" do
30
+ sql = I_Dig_Sql.new
31
+ sql[:MY_HERO] = "SELECT * FROM hero"
32
+ sql[:MY_NAME] = "SELECT * FROM name"
33
+ sql << %^
34
+ {{MY_HERO}}
35
+ {{MY_NAME}}
36
+ ^
37
+ sql(sql).should == sql(%^
38
+ WITH
39
+ MY_HERO AS (
40
+ SELECT * FROM hero
41
+ ),
42
+ MY_NAME AS (
43
+ SELECT * FROM name
44
+ )
45
+ MY_HERO
46
+ MY_NAME
47
+ ^)
48
+ end
49
+
50
+ it "replaces text with content: << MY_NAME >>" do
51
+ sql = I_Dig_Sql.new
52
+ sql[:MY_HERO] = "SELECT * FROM hero"
53
+ sql << %^
54
+ << MY_HERO >>
55
+ ^
56
+ sql(sql).should == "SELECT * FROM hero"
57
+ end # === it
58
+
59
+ %w{ * id }.each { |s|
60
+ it "adds WITH: << #{s} MY_NAME >>" do
61
+ sql = I_Dig_Sql.new
62
+ sql[:MY_HERO] = "SELECT id, p_id FROM hero"
63
+ sql[:MY_NAME] = "SELECT id, n_id FROM name"
64
+ sql << %^
65
+ << #{s} MY_NAME >>
66
+ << #{s} MY_HERO >>
67
+ ^
68
+ sql(sql).should == sql(%^
69
+ WITH
70
+ MY_NAME AS (
71
+ SELECT id, n_id FROM name
72
+ ),
73
+ MY_HERO AS (
74
+ SELECT id, p_id FROM hero
75
+ )
76
+ SELECT #{s} FROM MY_NAME
77
+ SELECT #{s} FROM MY_HERO
78
+ ^)
79
+ end # === it
80
+ }
81
+
82
+ end # === describe :I_Dig_Sql
83
+
84
+
@@ -0,0 +1,20 @@
1
+
2
+
3
+ describe '.new' do
4
+
5
+ it "merges sql values: .new(i_dig_sql)" do
6
+ first = I_Dig_Sql.new
7
+ first[:hero] = "SELECT * FROM hero"
8
+ second = I_Dig_Sql.new(first)
9
+ second[:name] = "SELECT * FROM name"
10
+ second << %^
11
+ << hero >>
12
+ << name >>
13
+ ^
14
+ sql(second).should == sql(%^
15
+ SELECT * FROM hero
16
+ SELECT * FROM name
17
+ ^)
18
+ end # === it
19
+
20
+ end # === describe '.new'
@@ -0,0 +1,38 @@
1
+
2
+ describe :vars do
3
+
4
+ it "combines vars from other digs" do
5
+ one = I_Dig_Sql.new
6
+ one.vars[:one] = 1
7
+
8
+ two = I_Dig_Sql.new
9
+ one.vars[:two] = 2
10
+
11
+ three = I_Dig_Sql.new
12
+ one.vars[:three] = 3
13
+
14
+ dig = I_Dig_Sql.new one, two, three
15
+ dig.vars[:four] = 4
16
+
17
+ dig.vars!.should == {
18
+ four: 4,
19
+ three: 3,
20
+ two: 2,
21
+ one: 1
22
+ }
23
+ end # === it
24
+
25
+ it "fails w/Duplicate if other digs have the same var name" do
26
+ should.raise(ArgumentError) {
27
+ one = I_Dig_Sql.new
28
+ one.vars[:two] = 2
29
+
30
+ i = I_Dig_Sql.new one
31
+ i.vars[:two] = 3
32
+ i.vars!
33
+ }.message.should.match /Key already set: :two/
34
+ end # === it
35
+
36
+ end # === describe :vars
37
+
38
+
@@ -0,0 +1,15 @@
1
+
2
+ describe :to_pair do
3
+
4
+ it "returns an Array: [String, Hash]" do
5
+ i = I_Dig_Sql.new <<-EOF
6
+ SELECT * FROM new
7
+ EOF
8
+ i.vars[:one] = 2
9
+ sql, vars = i.to_pair
10
+ sql(sql).should == sql("SELECT * FROM new")
11
+ vars.should == {one: 2}
12
+ end # === it
13
+
14
+ end # === describe :to_pair
15
+
@@ -0,0 +1,31 @@
1
+
2
+
3
+ describe :to_sql do
4
+
5
+ it "renders nested replacements" do
6
+ i = I_Dig_Sql.new <<-EOF
7
+ << FIRST >>
8
+ EOF
9
+ i[:FIRST] = " << SECOND >> "
10
+ i[:SECOND] = " << THIRD >> "
11
+ i[:THIRD] = "SELECT id FROM phantom"
12
+ sql(i).should == "SELECT id FROM phantom"
13
+ end # === it
14
+
15
+ it "prints CTE definitions once, if used multiple times" do
16
+ i = I_Dig_Sql.new <<-EOF
17
+ {{my_cte}}
18
+ {{my_cte}}
19
+ EOF
20
+ i[:my_cte] = "SELECT * FROM my"
21
+ sql(i).should == sql(%^
22
+ WITH
23
+ my_cte AS (
24
+ SELECT * FROM my
25
+ )
26
+ my_cte
27
+ my_cte
28
+ ^)
29
+ end # === it
30
+
31
+ end # === describe :to_sql
@@ -0,0 +1,40 @@
1
+
2
+ describe :funcs do
3
+
4
+ it "let's you use a lambda in a SQL fragment" do
5
+ sql = I_Dig_Sql.new :q, <<-EOF
6
+ SELECT name
7
+ FROM screen_name
8
+ WHERE
9
+ << id >>
10
+ EOF
11
+
12
+ sql[:id] = lambda { |dig| "id = :id" }
13
+
14
+ sql(sql).should == sql(%^
15
+ SELECT name
16
+ FROM screen_name
17
+ WHERE
18
+ id = :id
19
+ ^)
20
+ end # === it
21
+
22
+ it "passes args to function" do
23
+ sql = I_Dig_Sql.new :q, <<-EOF
24
+ SELECT name
25
+ FROM screen_name
26
+ WHERE
27
+ << names Hans Hoppe >>
28
+ EOF
29
+
30
+ sql[:names] = lambda { |dig, *args| "name IN [#{args.join ', '}]" }
31
+
32
+ sql(sql).should == sql(%^
33
+ SELECT name
34
+ FROM screen_name
35
+ WHERE
36
+ name IN [Hans, Hoppe]
37
+ ^)
38
+ end # === it
39
+
40
+ end # === describe :funcs
@@ -0,0 +1,51 @@
1
+
2
+
3
+ require "Bacon_Colored"
4
+ require "awesome_print"
5
+ require "unindent"
6
+ require "rouge"
7
+
8
+
9
+ module Kernel
10
+ def aputs *args
11
+ ap *args, :indent=>-2
12
+ end
13
+
14
+ def asql raw
15
+ base = raw.split("\n").detect { |l|
16
+ !l.empty?
17
+ }
18
+ prefix = base.split(/[^\ ]+/).first
19
+ indent = (prefix && prefix.size) || 0
20
+ src = if indent.zero?
21
+ raw
22
+ else
23
+ raw.split("\n").map { |l|
24
+ if l.index(prefix) != 0
25
+ prefix + l
26
+ else
27
+ l
28
+ end
29
+ }.join "\n"
30
+ end
31
+
32
+ puts "----------------------"
33
+ puts Rouge::Formatters::Terminal256.new.format(
34
+ Rouge::Lexers::SQL.new.lex(
35
+ src.unindent
36
+ )
37
+ )
38
+ puts "----------------------"
39
+ end
40
+
41
+ end # === module Kernel
42
+
43
+ def sql o
44
+ if o.is_a? String
45
+ return o.split.join(" ")
46
+ else
47
+ sql(o.to_sql)
48
+ end
49
+ end
50
+
51
+
metadata CHANGED
@@ -1,71 +1,127 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: i_dig_sql
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - da99
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-04 00:00:00.000000000 Z
11
+ date: 2015-04-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.5'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.5'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bacon
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">"
32
32
  - !ruby/object:Gem::Version
33
33
  version: '1.0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '1.0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: Bacon_Colored
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">"
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: pry
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ">"
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ">"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: awesome_print
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">"
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">"
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: anbt-sql-formatter
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">"
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">"
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rouge
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">"
102
+ - !ruby/object:Gem::Version
103
+ version: 0.0.0
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">"
109
+ - !ruby/object:Gem::Version
110
+ version: 0.0.0
111
+ - !ruby/object:Gem::Dependency
112
+ name: unindent
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">"
116
+ - !ruby/object:Gem::Version
117
+ version: 0.0.0
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">"
123
+ - !ruby/object:Gem::Version
124
+ version: 0.0.0
69
125
  description: "\n You probably want another gem: arel. Use that\n to generate SQL
70
126
  using Ruby.\n This gem only generates SELECT and WITH (ie CTE) statements/expressions.\n
71
127
  \ "
@@ -82,11 +138,17 @@ files:
82
138
  - Rakefile
83
139
  - VERSION
84
140
  - bin/test
85
- - englishy_sql.rb
86
141
  - i_dig_sql.gemspec
87
142
  - lib/i_dig_sql.rb
143
+ - lib/i_dig_sql/H.rb
88
144
  - lib/i_dig_sql/String.rb
89
- - specs/i_dig_sql.rb
145
+ - specs/0000-I_Dig_Sql.rb
146
+ - specs/0001-new.rb
147
+ - specs/0010-vars.rb
148
+ - specs/0011-to_pair.rb
149
+ - specs/0020-to_sql.rb
150
+ - specs/0030-funcs.rb
151
+ - specs/helpers.rb
90
152
  homepage: https://github.com/da99/i_dig_sql
91
153
  licenses:
92
154
  - MIT