querybuilder 0.5.7 → 0.5.8

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/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ .*
2
+ pkg
3
+ *.gem
4
+ coverage
data/History.txt CHANGED
@@ -1,8 +1,15 @@
1
+ == 0.5.8 2010-02-15
2
+
3
+ * 1 major enhancement
4
+ * Const_get code was not included in gem
5
+
1
6
  == 0.5.7 2010-02-08
7
+
2
8
  * 1 minor enhancement
3
9
  * Fixed class const_get to enable custom queries on classes in modules
4
10
 
5
11
  == 0.5.6 2009-10-15
12
+
6
13
  * 1 minor enhancement
7
14
  * Fixed library name (was not loaded on case sensitive systems)
8
15
 
data/Rakefile CHANGED
@@ -1,27 +1,52 @@
1
- %w[rubygems rake rake/clean fileutils newgem rubigen].each { |f| require f }
2
- require File.dirname(__FILE__) + '/lib/query_builder'
3
-
4
- # Generate all the Rake tasks
5
- # Run 'rake -T' to see list of generated tasks (from gem root directory)
6
- $hoe = Hoe.new('querybuilder', QueryBuilder::VERSION) do |p|
7
- p.developer('Gaspard Bucher', 'gaspard@teti.ch')
8
- p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
9
- p.rubyforge_name = 'querybuilder'
10
- p.extra_deps = [
11
- ['yamltest','>= 0.5.0'],
12
- ]
13
- p.extra_dev_deps = [
14
- ['newgem', ">= #{::Newgem::VERSION}"]
15
- ]
16
-
17
- p.clean_globs |= %w[**/.DS_Store tmp *.log]
18
- path = (p.rubyforge_name == p.name) ? p.rubyforge_name : "\#{p.rubyforge_name}/\#{p.name}"
19
- p.remote_rdoc_dir = File.join(path.gsub(/^#{p.rubyforge_name}\/?/,''), 'rdoc')
20
- p.rsync_args = '-av --delete --ignore-errors'
1
+ require 'pathname'
2
+ $LOAD_PATH.unshift((Pathname(__FILE__).dirname + 'lib').expand_path)
3
+
4
+ require 'querybuilder'
5
+ require 'rake'
6
+ require 'rake/testtask'
7
+
8
+ Rake::TestTask.new(:test) do |test|
9
+ test.libs << 'lib' << 'test'
10
+ test.pattern = 'test/**/**_test.rb'
11
+ test.verbose = true
12
+ end
13
+
14
+ begin
15
+ require 'rcov/rcovtask'
16
+ Rcov::RcovTask.new do |test|
17
+ test.libs << 'test' << 'lib'
18
+ test.pattern = 'test/**/**_test.rb'
19
+ test.verbose = true
20
+ test.rcov_opts = ['-T', '--exclude-only', '"test\/,^\/"']
21
+ end
22
+ rescue LoadError
23
+ task :rcov do
24
+ abort "RCov is not available. In order to run rcov, you must: sudo gem install rcov"
25
+ end
21
26
  end
22
27
 
23
- require 'newgem/tasks' # load /tasks/*.rake
24
- Dir['tasks/**/*.rake'].each { |t| load t }
28
+ task :default => :test
29
+
30
+ # GEM management
31
+ begin
32
+ require 'jeweler'
33
+ Jeweler::Tasks.new do |gemspec|
34
+ gemspec.version = QueryBuilder::VERSION
35
+ gemspec.name = "querybuilder"
36
+ gemspec.summary = %Q{QueryBuilder is an interpreter for the "pseudo sql" language}
37
+ gemspec.description = %Q{QueryBuilder is an interpreter for the "pseudo sql" language. This language
38
+ can be used for two purposes:
39
+
40
+ 1. protect your database from illegal SQL by securing queries
41
+ 2. ease writing complex relational queries by abstracting table internals}
42
+ gemspec.email = "gaspard@teti.ch"
43
+ gemspec.homepage = "http://zenadmin.org/524"
44
+ gemspec.authors = ["Gaspard Bucher"]
45
+
46
+ gemspec.add_development_dependency('yamltest', '>= 0.5.0')
47
+ end
48
+ Jeweler::GemcutterTasks.new
49
+ rescue LoadError
50
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
51
+ end
25
52
 
26
- # TODO - want other tests/tasks run by default? Add them to the list
27
- # task :default => [:spec, :features]
data/lib/query_builder.rb CHANGED
@@ -10,7 +10,7 @@ Syntax of a query is "RELATION [where ...|] [in ...|from SUB_QUERY|]".
10
10
  =end
11
11
  class QueryBuilder
12
12
  attr_reader :tables, :where, :errors, :join_tables, :distinct, :final_parser, :page_size
13
- VERSION = '0.5.7'
13
+ VERSION = '0.5.8'
14
14
 
15
15
  @@main_table = {}
16
16
  @@main_class = {}
@@ -70,7 +70,11 @@ class QueryBuilder
70
70
  definitions = YAML::load(File.read(File.join(dir,file)))
71
71
  custom_query_groups = [definitions.delete('groups') || definitions.delete('group') || custom_query_groups].flatten
72
72
  definitions.each do |klass,v|
73
- klass = Module.const_get(klass)
73
+ constant = nil
74
+ klass.split('::').each do |m|
75
+ constant = constant ? constant.const_get(m) : Module.const_get(m)
76
+ end
77
+ klass = constant
74
78
  raise ArgumentError.new("invalid class for CustomQueries (#{klass})") unless klass.ancestors.include?(QueryBuilder)
75
79
  @@custom_queries[klass] ||= {}
76
80
  custom_query_groups.each do |custom_query_group|
@@ -205,7 +209,11 @@ class QueryBuilder
205
209
  # DummyQuery.new("comments from nodes in project").main_class
206
210
  # => Comment
207
211
  def main_class
208
- Module.const_get(@@main_class[self.class])
212
+ constant = nil
213
+ @@main_class[self.class].split('::').each do |m|
214
+ constant = constant ? constant.const_get(m) : Module.const_get(m)
215
+ end
216
+ constant
209
217
  end
210
218
 
211
219
  protected
@@ -0,0 +1,73 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{querybuilder}
8
+ s.version = "0.5.8"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Gaspard Bucher"]
12
+ s.date = %q{2010-02-15}
13
+ s.description = %q{QueryBuilder is an interpreter for the "pseudo sql" language. This language
14
+ can be used for two purposes:
15
+
16
+ 1. protect your database from illegal SQL by securing queries
17
+ 2. ease writing complex relational queries by abstracting table internals}
18
+ s.email = %q{gaspard@teti.ch}
19
+ s.extra_rdoc_files = [
20
+ "README.rdoc"
21
+ ]
22
+ s.files = [
23
+ ".gitignore",
24
+ "History.txt",
25
+ "Manifest.txt",
26
+ "README.rdoc",
27
+ "Rakefile",
28
+ "lib/query_builder.rb",
29
+ "lib/querybuilder.rb",
30
+ "querybuilder.gemspec",
31
+ "script/console",
32
+ "script/destroy",
33
+ "script/generate",
34
+ "test/mock/custom_queries/test.yml",
35
+ "test/mock/dummy_query.rb",
36
+ "test/mock/queries/bar.yml",
37
+ "test/mock/queries/foo.yml",
38
+ "test/mock/user_query.rb",
39
+ "test/query_builder/basic.yml",
40
+ "test/query_builder/custom.yml",
41
+ "test/query_builder/errors.yml",
42
+ "test/query_builder/filters.yml",
43
+ "test/query_builder/joins.yml",
44
+ "test/query_builder/mixed.yml",
45
+ "test/query_builder_test.rb",
46
+ "test/test_helper.rb"
47
+ ]
48
+ s.homepage = %q{http://zenadmin.org/524}
49
+ s.rdoc_options = ["--charset=UTF-8"]
50
+ s.require_paths = ["lib"]
51
+ s.rubygems_version = %q{1.3.5}
52
+ s.summary = %q{QueryBuilder is an interpreter for the "pseudo sql" language}
53
+ s.test_files = [
54
+ "test/mock/dummy_query.rb",
55
+ "test/mock/user_query.rb",
56
+ "test/query_builder_test.rb",
57
+ "test/test_helper.rb"
58
+ ]
59
+
60
+ if s.respond_to? :specification_version then
61
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
62
+ s.specification_version = 3
63
+
64
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
65
+ s.add_development_dependency(%q<yamltest>, [">= 0.5.0"])
66
+ else
67
+ s.add_dependency(%q<yamltest>, [">= 0.5.0"])
68
+ end
69
+ else
70
+ s.add_dependency(%q<yamltest>, [">= 0.5.0"])
71
+ end
72
+ end
73
+
@@ -0,0 +1,8 @@
1
+ group: test2
2
+
3
+ DummyQuery:
4
+ bar:
5
+ select:
6
+ - bar
7
+ tables:
8
+ - bart
@@ -0,0 +1,11 @@
1
+ groups:
2
+ - test
3
+ - test2
4
+
5
+ DummyQuery:
6
+ foo:
7
+ select:
8
+ - foo
9
+ tables:
10
+ - foot
11
+ order: f DESC
File without changes
@@ -0,0 +1,62 @@
1
+ # test2 context (queries = [abc,foo])
2
+
3
+ it_should_be_available:
4
+ context:
5
+ custom_query_group: test
6
+ src: "abc"
7
+ res: "\"SELECT a,34 AS number,c FROM test WHERE 3 AND 2 AND 1 ORDER BY a ASC\""
8
+
9
+ it_should_be_customizable:
10
+ context:
11
+ custom_query_group: test
12
+ src: "foo where name < 50"
13
+ res: "\"SELECT foo FROM foot WHERE objects.name < 50 ORDER BY f DESC\""
14
+
15
+ it_should_be_customizable_with_select_attributes:
16
+ context:
17
+ custom_query_group: test
18
+ src: "abc where number < 50"
19
+ res: "\"SELECT a,34 AS number,c FROM test WHERE (34) < 50 AND 3 AND 2 AND 1 ORDER BY a ASC\""
20
+
21
+ it_should_not_find_queries_not_in_group:
22
+ context:
23
+ custom_query_group: test
24
+ src: "bar"
25
+ res: "unknown relation 'bar'"
26
+
27
+ # test2 context (queries = [foo,bar])
28
+ it_should_not_find_queries_not_in_file_named_group:
29
+ context:
30
+ custom_query_group: test2
31
+ src: "abc"
32
+ res: "unknown relation 'abc'"
33
+
34
+ it_should_find_queries_in_group_list:
35
+ context:
36
+ custom_query_group: test2
37
+ src: "bar"
38
+ res: "\"SELECT bar FROM bart\""
39
+
40
+ it_should_use_the_first_table_as_main:
41
+ context:
42
+ custom_query_group: test
43
+ src: "two_table where x = '4' and name like 'B%'"
44
+ res: "[\"SELECT x,IF(table_one.y,table_one.y,table_two.z) AS y,table_two.name FROM table_one,table_two WHERE (x) = ? AND (table_two.name) LIKE ?\", \"4\", \"B%\"]"
45
+
46
+ it_should_use_main_table_as_main:
47
+ context:
48
+ custom_query_group: test
49
+ src: "two_table_main where name = '4'"
50
+ res: "[\"SELECT x FROM table_one,foo,table_two WHERE foo.name = ?\", \"4\"]"
51
+
52
+ it_should_limit_the_entries:
53
+ context:
54
+ custom_query_group: test
55
+ src: "abc limit 4"
56
+ res: "/LIMIT 4/"
57
+
58
+ it_should_paginate_the_entries:
59
+ context:
60
+ custom_query_group: test
61
+ src: "abc limit 4 paginate foo"
62
+ res: "[\"SELECT a,34 AS number,c FROM test WHERE 3 AND 2 AND 1 ORDER BY a ASC LIMIT 4 OFFSET ?\", ((foo.to_i > 0 ? foo.to_i : 1)-1)*4]"
File without changes
File without changes
File without changes
File without changes
@@ -1,19 +1,19 @@
1
1
  require File.dirname(__FILE__) + '/test_helper.rb'
2
2
 
3
3
 
4
- class DummyQueryBuilder < Test::Unit::TestCase
4
+ class QueryBuilderTest < Test::Unit::TestCase
5
5
  yamltest
6
-
6
+
7
7
  def id; 123; end
8
8
  def parent_id; 333; end
9
9
  def project_id; 9999; end
10
10
  def connection; self; end
11
-
12
-
11
+
12
+
13
13
  def yt_parse(key, source, opts)
14
14
  opts = Hash[*(opts.map{|k,v| [k.to_sym, v]}.flatten)]
15
15
  query = DummyQuery.new(source, opts)
16
-
16
+
17
17
  case key
18
18
  when 'res'
19
19
  (query.main_class != DummyQueryClass ? "#{query.main_class.to_s}: " : '') + if res = query.to_s
@@ -31,6 +31,6 @@ class DummyQueryBuilder < Test::Unit::TestCase
31
31
  "parse not implemented for '#{key}' in query_builder_test.rb"
32
32
  end
33
33
  end
34
-
34
+
35
35
  yt_make
36
36
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: querybuilder
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.7
4
+ version: 0.5.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gaspard Bucher
@@ -9,83 +9,64 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-02-08 00:00:00 +01:00
12
+ date: 2010-02-15 00:00:00 +01:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: yamltest
17
- type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
20
- requirements:
21
- - - ">="
22
- - !ruby/object:Gem::Version
23
- version: 0.5.0
24
- version:
25
- - !ruby/object:Gem::Dependency
26
- name: newgem
27
- type: :development
28
- version_requirement:
29
- version_requirements: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: 1.3.0
34
- version:
35
- - !ruby/object:Gem::Dependency
36
- name: hoe
37
17
  type: :development
38
18
  version_requirement:
39
19
  version_requirements: !ruby/object:Gem::Requirement
40
20
  requirements:
41
21
  - - ">="
42
22
  - !ruby/object:Gem::Version
43
- version: 1.8.0
23
+ version: 0.5.0
44
24
  version:
45
25
  description: |-
46
26
  QueryBuilder is an interpreter for the "pseudo sql" language. This language
47
- can be used for two purposes:
27
+ can be used for two purposes:
48
28
 
49
- 1. protect your database from illegal SQL by securing queries
50
- 2. ease writing complex relational queries by abstracting table internals
51
- email:
52
- - gaspard@teti.ch
29
+ 1. protect your database from illegal SQL by securing queries
30
+ 2. ease writing complex relational queries by abstracting table internals
31
+ email: gaspard@teti.ch
53
32
  executables: []
54
33
 
55
34
  extensions: []
56
35
 
57
36
  extra_rdoc_files:
58
- - History.txt
59
- - Manifest.txt
60
37
  - README.rdoc
61
38
  files:
39
+ - .gitignore
62
40
  - History.txt
63
41
  - Manifest.txt
64
42
  - README.rdoc
65
43
  - Rakefile
66
44
  - lib/query_builder.rb
67
45
  - lib/querybuilder.rb
46
+ - querybuilder.gemspec
68
47
  - script/console
69
48
  - script/destroy
70
49
  - script/generate
71
50
  - test/mock/custom_queries/test.yml
72
51
  - test/mock/dummy_query.rb
52
+ - test/mock/queries/bar.yml
53
+ - test/mock/queries/foo.yml
73
54
  - test/mock/user_query.rb
74
- - test/QueryBuilder/basic.yml
75
- - test/QueryBuilder/errors.yml
76
- - test/QueryBuilder/filters.yml
77
- - test/QueryBuilder/joins.yml
78
- - test/QueryBuilder/mixed.yml
55
+ - test/query_builder/basic.yml
56
+ - test/query_builder/custom.yml
57
+ - test/query_builder/errors.yml
58
+ - test/query_builder/filters.yml
59
+ - test/query_builder/joins.yml
60
+ - test/query_builder/mixed.yml
61
+ - test/query_builder_test.rb
79
62
  - test/test_helper.rb
80
- - test/test_QueryBuilder.rb
81
63
  has_rdoc: true
82
- homepage: http://github.com/zena/querybuilder/tree/master
64
+ homepage: http://zenadmin.org/524
83
65
  licenses: []
84
66
 
85
67
  post_install_message:
86
68
  rdoc_options:
87
- - --main
88
- - README.rdoc
69
+ - --charset=UTF-8
89
70
  require_paths:
90
71
  - lib
91
72
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -102,11 +83,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
102
83
  version:
103
84
  requirements: []
104
85
 
105
- rubyforge_project: querybuilder
86
+ rubyforge_project:
106
87
  rubygems_version: 1.3.5
107
88
  signing_key:
108
89
  specification_version: 3
109
90
  summary: QueryBuilder is an interpreter for the "pseudo sql" language
110
91
  test_files:
92
+ - test/mock/dummy_query.rb
93
+ - test/mock/user_query.rb
94
+ - test/query_builder_test.rb
111
95
  - test/test_helper.rb
112
- - test/test_QueryBuilder.rb