squeel 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. data/.gitignore +4 -0
  2. data/Gemfile +8 -0
  3. data/LICENSE +20 -0
  4. data/README.rdoc +41 -0
  5. data/Rakefile +19 -0
  6. data/lib/core_ext/hash.rb +13 -0
  7. data/lib/core_ext/symbol.rb +36 -0
  8. data/lib/squeel.rb +26 -0
  9. data/lib/squeel/adapters/active_record.rb +6 -0
  10. data/lib/squeel/adapters/active_record/join_association.rb +90 -0
  11. data/lib/squeel/adapters/active_record/join_dependency.rb +68 -0
  12. data/lib/squeel/adapters/active_record/relation.rb +292 -0
  13. data/lib/squeel/configuration.rb +25 -0
  14. data/lib/squeel/constants.rb +23 -0
  15. data/lib/squeel/contexts/join_dependency_context.rb +74 -0
  16. data/lib/squeel/dsl.rb +31 -0
  17. data/lib/squeel/nodes.rb +10 -0
  18. data/lib/squeel/nodes/and.rb +8 -0
  19. data/lib/squeel/nodes/binary.rb +23 -0
  20. data/lib/squeel/nodes/function.rb +84 -0
  21. data/lib/squeel/nodes/join.rb +51 -0
  22. data/lib/squeel/nodes/key_path.rb +127 -0
  23. data/lib/squeel/nodes/nary.rb +35 -0
  24. data/lib/squeel/nodes/not.rb +8 -0
  25. data/lib/squeel/nodes/operation.rb +23 -0
  26. data/lib/squeel/nodes/operators.rb +27 -0
  27. data/lib/squeel/nodes/or.rb +8 -0
  28. data/lib/squeel/nodes/order.rb +35 -0
  29. data/lib/squeel/nodes/predicate.rb +49 -0
  30. data/lib/squeel/nodes/predicate_operators.rb +17 -0
  31. data/lib/squeel/nodes/stub.rb +113 -0
  32. data/lib/squeel/nodes/unary.rb +22 -0
  33. data/lib/squeel/predicate_methods.rb +22 -0
  34. data/lib/squeel/predicate_methods/function.rb +9 -0
  35. data/lib/squeel/predicate_methods/predicate.rb +11 -0
  36. data/lib/squeel/predicate_methods/stub.rb +9 -0
  37. data/lib/squeel/predicate_methods/symbol.rb +9 -0
  38. data/lib/squeel/version.rb +3 -0
  39. data/lib/squeel/visitors.rb +3 -0
  40. data/lib/squeel/visitors/base.rb +46 -0
  41. data/lib/squeel/visitors/order_visitor.rb +107 -0
  42. data/lib/squeel/visitors/predicate_visitor.rb +179 -0
  43. data/lib/squeel/visitors/select_visitor.rb +103 -0
  44. data/spec/blueprints/articles.rb +5 -0
  45. data/spec/blueprints/comments.rb +5 -0
  46. data/spec/blueprints/notes.rb +3 -0
  47. data/spec/blueprints/people.rb +4 -0
  48. data/spec/blueprints/tags.rb +3 -0
  49. data/spec/console.rb +22 -0
  50. data/spec/core_ext/symbol_spec.rb +68 -0
  51. data/spec/helpers/squeel_helper.rb +5 -0
  52. data/spec/spec_helper.rb +30 -0
  53. data/spec/squeel/adapters/active_record/join_association_spec.rb +18 -0
  54. data/spec/squeel/adapters/active_record/join_depdendency_spec.rb +60 -0
  55. data/spec/squeel/adapters/active_record/relation_spec.rb +437 -0
  56. data/spec/squeel/contexts/join_dependency_context_spec.rb +43 -0
  57. data/spec/squeel/dsl_spec.rb +73 -0
  58. data/spec/squeel/nodes/function_spec.rb +149 -0
  59. data/spec/squeel/nodes/join_spec.rb +27 -0
  60. data/spec/squeel/nodes/key_path_spec.rb +92 -0
  61. data/spec/squeel/nodes/operation_spec.rb +149 -0
  62. data/spec/squeel/nodes/operators_spec.rb +87 -0
  63. data/spec/squeel/nodes/order_spec.rb +30 -0
  64. data/spec/squeel/nodes/predicate_operators_spec.rb +88 -0
  65. data/spec/squeel/nodes/predicate_spec.rb +92 -0
  66. data/spec/squeel/nodes/stub_spec.rb +178 -0
  67. data/spec/squeel/visitors/order_visitor_spec.rb +128 -0
  68. data/spec/squeel/visitors/predicate_visitor_spec.rb +267 -0
  69. data/spec/squeel/visitors/select_visitor_spec.rb +115 -0
  70. data/spec/support/schema.rb +101 -0
  71. data/squeel.gemspec +44 -0
  72. metadata +221 -0
@@ -0,0 +1,101 @@
1
+ require 'active_record'
2
+
3
+ ActiveRecord::Base.establish_connection(
4
+ :adapter => 'sqlite3',
5
+ :database => ':memory:'
6
+ )
7
+
8
+ class Person < ActiveRecord::Base
9
+ belongs_to :parent, :class_name => 'Person', :foreign_key => :parent_id
10
+ has_many :children, :class_name => 'Person', :foreign_key => :parent_id
11
+ has_many :articles
12
+ has_many :comments
13
+ has_many :authored_article_comments, :through => :articles,
14
+ :class_name => 'Comment', :foreign_key => :person_id
15
+ has_many :notes, :as => :notable
16
+ end
17
+
18
+ class Article < ActiveRecord::Base
19
+ belongs_to :person
20
+ has_many :comments
21
+ has_and_belongs_to_many :tags
22
+ has_many :notes, :as => :notable
23
+ end
24
+
25
+ class Comment < ActiveRecord::Base
26
+ belongs_to :article
27
+ belongs_to :person
28
+ end
29
+
30
+ class Tag < ActiveRecord::Base
31
+ has_and_belongs_to_many :articles
32
+ end
33
+
34
+ class Note < ActiveRecord::Base
35
+ belongs_to :notable, :polymorphic => true
36
+ end
37
+
38
+ module Schema
39
+ def self.create
40
+ ActiveRecord::Base.silence do
41
+ ActiveRecord::Migration.verbose = false
42
+
43
+ ActiveRecord::Schema.define do
44
+ create_table :people, :force => true do |t|
45
+ t.integer :parent_id
46
+ t.string :name
47
+ t.integer :salary
48
+ end
49
+
50
+ create_table :articles, :force => true do |t|
51
+ t.integer :person_id
52
+ t.string :title
53
+ t.text :body
54
+ end
55
+
56
+ create_table :comments, :force => true do |t|
57
+ t.integer :article_id
58
+ t.integer :person_id
59
+ t.text :body
60
+ end
61
+
62
+ create_table :tags, :force => true do |t|
63
+ t.string :name
64
+ end
65
+
66
+ create_table :articles_tags, :force => true, :id => false do |t|
67
+ t.integer :article_id
68
+ t.integer :tag_id
69
+ end
70
+
71
+ create_table :notes, :force => true do |t|
72
+ t.integer :notable_id
73
+ t.string :notable_type
74
+ t.string :note
75
+ end
76
+
77
+ end
78
+ end
79
+
80
+ 10.times do
81
+ person = Person.make
82
+ Note.make(:notable => person)
83
+ 3.times do
84
+ article = Article.make(:person => person)
85
+ 3.times do
86
+ article.tags = [Tag.make, Tag.make, Tag.make]
87
+ end
88
+ Note.make(:notable => article)
89
+ 10.times do
90
+ Comment.make(:article => article)
91
+ end
92
+ end
93
+ 2.times do
94
+ Comment.make(:person => person)
95
+ end
96
+ end
97
+
98
+ Comment.make(:body => 'First post!', :article => Article.make(:title => 'Hello, world!'))
99
+
100
+ end
101
+ end
data/squeel.gemspec ADDED
@@ -0,0 +1,44 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "squeel/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "squeel"
7
+ s.version = Squeel::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Ernie Miller"]
10
+ s.email = ["ernie@metautonomo.us"]
11
+ s.homepage = "http://metautonomo.us/projects/squeel"
12
+ s.summary = %q{ActiveRecord 3 query syntax on steroids.}
13
+ s.description = %q{
14
+ Squeel offers the ability to call any Arel predicate methods
15
+ (with a few convenient aliases) on your model's attributes instead
16
+ of the ones normally offered by ActiveRecord's hash parameters. It also
17
+ adds convenient syntax for order clauses, smarter mapping of nested hash
18
+ conditions, and a debug_sql method to see the real SQL your code is
19
+ generating without running it against the database. If you like the new
20
+ AR 3.0 query interface, you'll love it with Squeel.
21
+ }
22
+ s.post_install_message = %q{
23
+ *** Thanks for installing Squeel! ***
24
+ Be sure to check out http://metautonomo.us/projects/squeel/ for a
25
+ walkthrough of Squeel's features, and click the donate button if
26
+ you're feeling especially appreciative. It'd help me justify this
27
+ "open source" stuff to my lovely wife. :)
28
+
29
+ }
30
+
31
+ s.rubyforge_project = "squeel"
32
+
33
+ s.add_dependency 'activerecord', '~> 3.1.0.alpha'
34
+ s.add_dependency 'activesupport', '~> 3.1.0.alpha'
35
+ s.add_development_dependency 'rspec', '~> 2.5.0'
36
+ s.add_development_dependency 'machinist', '~> 1.0.6'
37
+ s.add_development_dependency 'faker', '~> 0.9.5'
38
+ s.add_development_dependency 'sqlite3', '~> 1.3.3'
39
+
40
+ s.files = `git ls-files`.split("\n")
41
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
42
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
43
+ s.require_paths = ["lib"]
44
+ end
metadata ADDED
@@ -0,0 +1,221 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: squeel
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.5.0
6
+ platform: ruby
7
+ authors:
8
+ - Ernie Miller
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2011-04-09 00:00:00 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: activerecord
17
+ prerelease: false
18
+ requirement: &id001 !ruby/object:Gem::Requirement
19
+ none: false
20
+ requirements:
21
+ - - ~>
22
+ - !ruby/object:Gem::Version
23
+ version: 3.1.0.alpha
24
+ type: :runtime
25
+ version_requirements: *id001
26
+ - !ruby/object:Gem::Dependency
27
+ name: activesupport
28
+ prerelease: false
29
+ requirement: &id002 !ruby/object:Gem::Requirement
30
+ none: false
31
+ requirements:
32
+ - - ~>
33
+ - !ruby/object:Gem::Version
34
+ version: 3.1.0.alpha
35
+ type: :runtime
36
+ version_requirements: *id002
37
+ - !ruby/object:Gem::Dependency
38
+ name: rspec
39
+ prerelease: false
40
+ requirement: &id003 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 2.5.0
46
+ type: :development
47
+ version_requirements: *id003
48
+ - !ruby/object:Gem::Dependency
49
+ name: machinist
50
+ prerelease: false
51
+ requirement: &id004 !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ~>
55
+ - !ruby/object:Gem::Version
56
+ version: 1.0.6
57
+ type: :development
58
+ version_requirements: *id004
59
+ - !ruby/object:Gem::Dependency
60
+ name: faker
61
+ prerelease: false
62
+ requirement: &id005 !ruby/object:Gem::Requirement
63
+ none: false
64
+ requirements:
65
+ - - ~>
66
+ - !ruby/object:Gem::Version
67
+ version: 0.9.5
68
+ type: :development
69
+ version_requirements: *id005
70
+ - !ruby/object:Gem::Dependency
71
+ name: sqlite3
72
+ prerelease: false
73
+ requirement: &id006 !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ~>
77
+ - !ruby/object:Gem::Version
78
+ version: 1.3.3
79
+ type: :development
80
+ version_requirements: *id006
81
+ description: "\n Squeel offers the ability to call any Arel predicate methods\n (with a few convenient aliases) on your model's attributes instead\n of the ones normally offered by ActiveRecord's hash parameters. It also\n adds convenient syntax for order clauses, smarter mapping of nested hash\n conditions, and a debug_sql method to see the real SQL your code is\n generating without running it against the database. If you like the new\n AR 3.0 query interface, you'll love it with Squeel.\n "
82
+ email:
83
+ - ernie@metautonomo.us
84
+ executables: []
85
+
86
+ extensions: []
87
+
88
+ extra_rdoc_files: []
89
+
90
+ files:
91
+ - .gitignore
92
+ - Gemfile
93
+ - LICENSE
94
+ - README.rdoc
95
+ - Rakefile
96
+ - lib/core_ext/hash.rb
97
+ - lib/core_ext/symbol.rb
98
+ - lib/squeel.rb
99
+ - lib/squeel/adapters/active_record.rb
100
+ - lib/squeel/adapters/active_record/join_association.rb
101
+ - lib/squeel/adapters/active_record/join_dependency.rb
102
+ - lib/squeel/adapters/active_record/relation.rb
103
+ - lib/squeel/configuration.rb
104
+ - lib/squeel/constants.rb
105
+ - lib/squeel/contexts/join_dependency_context.rb
106
+ - lib/squeel/dsl.rb
107
+ - lib/squeel/nodes.rb
108
+ - lib/squeel/nodes/and.rb
109
+ - lib/squeel/nodes/binary.rb
110
+ - lib/squeel/nodes/function.rb
111
+ - lib/squeel/nodes/join.rb
112
+ - lib/squeel/nodes/key_path.rb
113
+ - lib/squeel/nodes/nary.rb
114
+ - lib/squeel/nodes/not.rb
115
+ - lib/squeel/nodes/operation.rb
116
+ - lib/squeel/nodes/operators.rb
117
+ - lib/squeel/nodes/or.rb
118
+ - lib/squeel/nodes/order.rb
119
+ - lib/squeel/nodes/predicate.rb
120
+ - lib/squeel/nodes/predicate_operators.rb
121
+ - lib/squeel/nodes/stub.rb
122
+ - lib/squeel/nodes/unary.rb
123
+ - lib/squeel/predicate_methods.rb
124
+ - lib/squeel/predicate_methods/function.rb
125
+ - lib/squeel/predicate_methods/predicate.rb
126
+ - lib/squeel/predicate_methods/stub.rb
127
+ - lib/squeel/predicate_methods/symbol.rb
128
+ - lib/squeel/version.rb
129
+ - lib/squeel/visitors.rb
130
+ - lib/squeel/visitors/base.rb
131
+ - lib/squeel/visitors/order_visitor.rb
132
+ - lib/squeel/visitors/predicate_visitor.rb
133
+ - lib/squeel/visitors/select_visitor.rb
134
+ - spec/blueprints/articles.rb
135
+ - spec/blueprints/comments.rb
136
+ - spec/blueprints/notes.rb
137
+ - spec/blueprints/people.rb
138
+ - spec/blueprints/tags.rb
139
+ - spec/console.rb
140
+ - spec/core_ext/symbol_spec.rb
141
+ - spec/helpers/squeel_helper.rb
142
+ - spec/spec_helper.rb
143
+ - spec/squeel/adapters/active_record/join_association_spec.rb
144
+ - spec/squeel/adapters/active_record/join_depdendency_spec.rb
145
+ - spec/squeel/adapters/active_record/relation_spec.rb
146
+ - spec/squeel/contexts/join_dependency_context_spec.rb
147
+ - spec/squeel/dsl_spec.rb
148
+ - spec/squeel/nodes/function_spec.rb
149
+ - spec/squeel/nodes/join_spec.rb
150
+ - spec/squeel/nodes/key_path_spec.rb
151
+ - spec/squeel/nodes/operation_spec.rb
152
+ - spec/squeel/nodes/operators_spec.rb
153
+ - spec/squeel/nodes/order_spec.rb
154
+ - spec/squeel/nodes/predicate_operators_spec.rb
155
+ - spec/squeel/nodes/predicate_spec.rb
156
+ - spec/squeel/nodes/stub_spec.rb
157
+ - spec/squeel/visitors/order_visitor_spec.rb
158
+ - spec/squeel/visitors/predicate_visitor_spec.rb
159
+ - spec/squeel/visitors/select_visitor_spec.rb
160
+ - spec/support/schema.rb
161
+ - squeel.gemspec
162
+ homepage: http://metautonomo.us/projects/squeel
163
+ licenses: []
164
+
165
+ post_install_message: "\n\
166
+ *** Thanks for installing Squeel! ***\n\
167
+ Be sure to check out http://metautonomo.us/projects/squeel/ for a\n\
168
+ walkthrough of Squeel's features, and click the donate button if\n\
169
+ you're feeling especially appreciative. It'd help me justify this\n\
170
+ \"open source\" stuff to my lovely wife. :)\n\n"
171
+ rdoc_options: []
172
+
173
+ require_paths:
174
+ - lib
175
+ required_ruby_version: !ruby/object:Gem::Requirement
176
+ none: false
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: "0"
181
+ required_rubygems_version: !ruby/object:Gem::Requirement
182
+ none: false
183
+ requirements:
184
+ - - ">="
185
+ - !ruby/object:Gem::Version
186
+ version: "0"
187
+ requirements: []
188
+
189
+ rubyforge_project: squeel
190
+ rubygems_version: 1.7.2
191
+ signing_key:
192
+ specification_version: 3
193
+ summary: ActiveRecord 3 query syntax on steroids.
194
+ test_files:
195
+ - spec/blueprints/articles.rb
196
+ - spec/blueprints/comments.rb
197
+ - spec/blueprints/notes.rb
198
+ - spec/blueprints/people.rb
199
+ - spec/blueprints/tags.rb
200
+ - spec/console.rb
201
+ - spec/core_ext/symbol_spec.rb
202
+ - spec/helpers/squeel_helper.rb
203
+ - spec/spec_helper.rb
204
+ - spec/squeel/adapters/active_record/join_association_spec.rb
205
+ - spec/squeel/adapters/active_record/join_depdendency_spec.rb
206
+ - spec/squeel/adapters/active_record/relation_spec.rb
207
+ - spec/squeel/contexts/join_dependency_context_spec.rb
208
+ - spec/squeel/dsl_spec.rb
209
+ - spec/squeel/nodes/function_spec.rb
210
+ - spec/squeel/nodes/join_spec.rb
211
+ - spec/squeel/nodes/key_path_spec.rb
212
+ - spec/squeel/nodes/operation_spec.rb
213
+ - spec/squeel/nodes/operators_spec.rb
214
+ - spec/squeel/nodes/order_spec.rb
215
+ - spec/squeel/nodes/predicate_operators_spec.rb
216
+ - spec/squeel/nodes/predicate_spec.rb
217
+ - spec/squeel/nodes/stub_spec.rb
218
+ - spec/squeel/visitors/order_visitor_spec.rb
219
+ - spec/squeel/visitors/predicate_visitor_spec.rb
220
+ - spec/squeel/visitors/select_visitor_spec.rb
221
+ - spec/support/schema.rb